This script analyze 10x scRNA-seq data from E15, E16, P1, and P4 wt mice

library(dplyr)
library(Matrix)
require(devtools)
install_version("mvtnorm", version = "1.0-8", repos = "http://cran.us.r-project.org") ##Note that I need version 1.0-8 because the newest version requires R>3.5 (my r version is 3.4). mvtnorm is a dependency for fpc which is a dependency for Seurat.
library(Seurat)
First load E15 data (nGene 1k, nUMI 5k already applied)
load("E15_Oct10_10X_Trachea.RData")
E15_Oct10_mm10.1.2.0_Trachea <- SetAllIdent(object = E15_Oct10_mm10.1.2.0_Trachea, id = "genotype")
second load seu_E16P1P4_wt.RData
load("seu_E16P1P4_wt.RData")
data has been log normalized.
seurat_E15E16P1P4_wt<-MergeSeurat(object1 = seu_E16P1P4_wt,object2 = SubsetData(object=E15_Oct10_mm10.1.2.0_Trachea,ident.use=c("wt")),min.cells = 1,min.genes = 1,project="E15Oct10_E16Dec7_P1Dec11_P4Oct18")
remove old analysis done on the E16P1P4 dataset:
seurat_E15E16P1P4_wt@meta.data<-seurat_E15E16P1P4_wt@meta.data[,-which(names(seurat_E15E16P1P4_wt@meta.data) %in% c("res.0.8", "res.1.2","res.1.4","cell_type","S.Score","G2M.Score","Phase","old.ident","CellCycle_score","mocosaGoblet_score","ciliopathy_score","PCD_score"))]
Basic stats about the data:
median(seurat_E15E16P1P4_wt@meta.data$nGene) 
[1] 2979
mean(seurat_E15E16P1P4_wt@meta.data$nGene) 
[1] 3220.857
median(seurat_E15E16P1P4_wt@meta.data$nUMI) 
[1] 9872
mean(seurat_E15E16P1P4_wt@meta.data$nUMI) 
[1] 12465.92
table(seurat_E15E16P1P4_wt@meta.data$age) 

 E15  E16   P1   P4 
4398 8432 2270 1709 
table(seurat_E15E16P1P4_wt@meta.data$seq_group) 

E15_Oct10_wt_green   E15_Oct10_wt_red      E16_Dec7_wt_1      E16_Dec7_wt_6      P1_Dec11_wt_6      P1_Dec11_wt_7 
              2806               1592               3338               5094               1110               1160 
 P4_Oct18_wt_green    P4_Oct18_wt_red 
               803                906 
scale the data:
seurat_E15E16P1P4_wt <- ScaleData(object = seurat_E15E16P1P4_wt)
find variable genes and run PCA:
seurat_E15E16P1P4_wt <- FindVariableGenes(object = seurat_E15E16P1P4_wt, do.plot = TRUE, x.low.cutoff=0.1,x.high.cutoff = Inf, y.cutoff = 0.5)
seurat_E15E16P1P4_wt <- RunPCA(object = seurat_E15E16P1P4_wt,pcs.compute = 25, do.print = FALSE)
seurat_E15E16P1P4_wt <- ProjectPCA(object = seurat_E15E16P1P4_wt, do.print = FALSE)

PCElbowPlot(object = seurat_E15E16P1P4_wt,num.pc = 25)
clustering:
try resolution=0.8:
n.pcs = 24
res.used <- 0.8

seurat_E15E16P1P4_wt <- FindClusters(object = seurat_E15E16P1P4_wt, reduction.type = "pca", dims.use = 1:n.pcs, 
    resolution = res.used, print.output = 0, save.SNN = TRUE)
seurat_E15E16P1P4_wt <- RunTSNE(object = seurat_E15E16P1P4_wt, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2)

resolution=1.4:
n.pcs = 24
res.used <- 1.4
seurat_E15E16P1P4_wt <- FindClusters(object = seurat_E15E16P1P4_wt, reduction.type = "pca", dims.use = 1:n.pcs, 
    resolution = res.used, print.output = 0, save.SNN = TRUE)
Build parameters exactly match those of already computed and stored SNN. To force recalculation, set force.recalc to TRUE.
k.param=15 to have better distinction for rare cells:
seurat_E15E16P1P4_wt <- RunTSNE(object = seurat_E15E16P1P4_wt, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=15)
TSNEPlot(object = seurat_E15E16P1P4_wt, do.label = T,pt.size = 0.2,group.by="res.1.4")

res1.6 leads to further specification of immune cells, P1 and P4 mesenchymal progenitor separation, and separation of E16 basal:
n.pcs = 24
res.used <- 1.6

seurat_E15E16P1P4_wt <- FindClusters(object = seurat_E15E16P1P4_wt, reduction.type = "pca", dims.use = 1:n.pcs, 
    resolution = res.used, print.output = 0, save.SNN = TRUE)
seurat_E15E16P1P4_wt <- RunTSNE(object = seurat_E15E16P1P4_wt, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=15)
TSNEPlot(object = seurat_E15E16P1P4_wt, do.label = T,pt.size = 0.2,group.by="res.1.6")
We will use resolution of 1.4 for further analysis.

——————————————————————–

#save(seurat_E15E16P1P4_wt,file="seuratE15E16P1P4_wt.RData")  # this seurat object will be updated and saved as analysis goes
#load("seuratE15E16P1P4_wt.RData")

2 E16 wt mice:

2 P1 wt mice:

Annotate clusters by known markers:
seurat_E15E16P1P4_wt <- SetAllIdent(object = seurat_E15E16P1P4_wt, id = "res.1.4")
DoHeatmap(object = seurat_E15E16P1P4_wt, genes.use = c("Epcam","Trp63","Krt4","Scgb3a2","Spdef","Creb3l1","Muc5b","Gp2","Foxj1","Snap25","Chga","Plp1","Mpz","Fcer1g","Pecam1","Acta2","Myh11","Col11a1","Acan","Wnt2","Pi16","Ly6a","Twist2","Mki67","Top2a","Tg","Pax8"), 
    slim.col.label = TRUE, group.label.rot = TRUE,use.scaled = T,group.by="res.1.4",group.cex = 25,cex.row=30,group.order = c(3,8,11,9,1,30,2,20,29,7,26,27,28,14,31,23,18,21,13,15,19,16,10,12,6,4,17,0,5,33,22,25,24,32)
  )

cluster annotation v1:
library(plyr)
seurat_E15E16P1P4_wt@meta.data$cell_type<-mapvalues(seurat_E15E16P1P4_wt@meta.data$res.1.4,from=c("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33"),to=c("Fibroblast","Basal","Secretory","Basal","Fibroblast","Fibroblast","Fibroblast","Secretory","CyclingEpithelial","Transitional","Fibroblast","CyclingEpithelial","Fibroblast","Fibroblast","Immune","Fibroblast","Fibroblast","Fibroblast","Muscle","Fibroblast","Ciliated","Muscle","MesenchymalProgenitor","Endothelial","Thyroid","MesenchymalProgenitor","Neural/Schwann","Ciliated","CiliaSecretory","Basal","CyclingEpithelial","Endothelial","Doublet","MesenchymalProgenitor"))
use nonShh subset clustering information (seurat object: E15E16P1P4_wt_nonShh resolution=1.6) to annotate those non-epithelial cells:
seurat_E15E16P1P4_wt<-AddMetaData(object = seurat_E15E16P1P4_wt, metadata = wt_nonShh_cellType1.6, col.name = "specific_type")
table(seurat_E15E16P1P4_wt@meta.data$specific_type)

          Chondrocyte     CyclingFibroblast            Fibroblast              Immune_1              Immune_2 
                  956                  1516                  4688                   347                   166 
 LymphaticEndothelial MesenchymalProgenitor                Muscle            Neuron/NEC                   RBC 
                  134                   511                   720                    51                    59 
          SchwannCell   VascularEndothelial         VSMC/pericyte 
                   94                   268                    80 
keep the epithelial cell annotation as in seurat_E15E16P1P4_wt@meta.data$cell_type:
seurat_E15E16P1P4_wt@meta.data$specific_type <- ifelse(is.na(seurat_E15E16P1P4_wt@meta.data$specific_type), as.character(seurat_E15E16P1P4_wt@meta.data$cell_type), as.character(seurat_E15E16P1P4_wt@meta.data$specific_type))
now we have new (more detailed) annotation for all cells:
table(seurat_E15E16P1P4_wt@meta.data$specific_type)

                Basal           Chondrocyte        CiliaSecretory              Ciliated     CyclingEpithelial 
                 2491                   956                   196                   571                  1297 
    CyclingFibroblast               Doublet            Fibroblast              Immune_1              Immune_2 
                 1516                    89                  4688                   347                   166 
 LymphaticEndothelial MesenchymalProgenitor                Muscle            Neuron/NEC                   RBC 
                  134                   511                   720                    51                    59 
          SchwannCell             Secretory               Thyroid          Transitional   VascularEndothelial 
                   94                  1729                   245                   601                   268 
        VSMC/pericyte 
                   80 
table(seurat_E15E16P1P4_wt@meta.data$specific_type,seurat_E15E16P1P4_wt@meta.data$gate,useNA = "always")
                       
                        green  red <NA>
  Basal                  1106    1 1384
  Chondrocyte               4  327  625
  CiliaSecretory           76    0  120
  Ciliated                202    2  367
  CyclingEpithelial      1160    3  134
  CyclingFibroblast         4  374 1138
  Doublet                   0    0   89
  Fibroblast               27  833 3828
  Immune_1                  0   72  275
  Immune_2                  0   46  120
  LymphaticEndothelial      0   33  101
  MesenchymalProgenitor     7  192  312
  Muscle                    1  251  468
  Neuron/NEC                0   36   15
  RBC                       0    1   58
  SchwannCell               0   36   58
  Secretory               412    1 1316
  Thyroid                   8  213   24
  Transitional            601    0    0
  VascularEndothelial       0   67  201
  VSMC/pericyte             1   10   69
  <NA>                      0    0    0
specific_type of each cell is defined later.

find differentially expressed genes between clusters of interest:
seurat_E15E16P1P4_wt <- SetAllIdent(object = seurat_E15E16P1P4_wt, id = "res.1.4")
E15E16P1P4_wt_res14_BasalSecretory<-FindMarkers(seurat_E15E16P1P4_wt,ident.1=c(9,30),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 44s      
   |++                                                | 2 % ~02m 46s      
   |++                                                | 3 % ~02m 41s      
   |+++                                               | 4 % ~02m 38s      
   |+++                                               | 6 % ~02m 34s      
   |++++                                              | 7 % ~02m 32s      
   |++++                                              | 8 % ~02m 33s      
   |+++++                                             | 9 % ~02m 31s      
   |++++++                                            | 10% ~02m 29s      
   |++++++                                            | 11% ~02m 26s      
   |+++++++                                           | 12% ~02m 24s      
   |+++++++                                           | 13% ~02m 22s      
   |++++++++                                          | 15% ~02m 20s      
   |++++++++                                          | 16% ~02m 22s      
   |+++++++++                                         | 17% ~02m 20s      
   |+++++++++                                         | 18% ~02m 17s      
   |++++++++++                                        | 19% ~02m 15s      
   |+++++++++++                                       | 20% ~02m 13s      
   |+++++++++++                                       | 21% ~02m 10s      
   |++++++++++++                                      | 22% ~02m 08s      
   |++++++++++++                                      | 24% ~02m 06s      
   |+++++++++++++                                     | 25% ~02m 04s      
   |+++++++++++++                                     | 26% ~02m 02s      
   |++++++++++++++                                    | 27% ~02m 00s      
   |+++++++++++++++                                   | 28% ~01m 58s      
   |+++++++++++++++                                   | 29% ~01m 56s      
   |++++++++++++++++                                  | 30% ~01m 54s      
   |++++++++++++++++                                  | 31% ~01m 53s      
   |+++++++++++++++++                                 | 33% ~01m 51s      
   |+++++++++++++++++                                 | 34% ~01m 49s      
   |++++++++++++++++++                                | 35% ~01m 47s      
   |++++++++++++++++++                                | 36% ~01m 45s      
   |+++++++++++++++++++                               | 37% ~01m 44s      
   |++++++++++++++++++++                              | 38% ~01m 42s      
   |++++++++++++++++++++                              | 39% ~01m 40s      
   |+++++++++++++++++++++                             | 40% ~01m 39s      
   |+++++++++++++++++++++                             | 42% ~01m 37s      
   |++++++++++++++++++++++                            | 43% ~01m 35s      
   |++++++++++++++++++++++                            | 44% ~01m 33s      
   |+++++++++++++++++++++++                           | 45% ~01m 31s      
   |++++++++++++++++++++++++                          | 46% ~01m 29s      
   |++++++++++++++++++++++++                          | 47% ~01m 27s      
   |+++++++++++++++++++++++++                         | 48% ~01m 25s      
   |+++++++++++++++++++++++++                         | 49% ~01m 23s      
   |++++++++++++++++++++++++++                        | 51% ~01m 21s      
   |++++++++++++++++++++++++++                        | 52% ~01m 19s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 17s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 16s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 14s      
   |+++++++++++++++++++++++++++++                     | 56% ~01m 12s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 10s      
   |++++++++++++++++++++++++++++++                    | 58% ~01m 08s      
   |++++++++++++++++++++++++++++++                    | 60% ~01m 06s      
   |+++++++++++++++++++++++++++++++                   | 61% ~01m 05s      
   |+++++++++++++++++++++++++++++++                   | 62% ~01m 03s      
   |++++++++++++++++++++++++++++++++                  | 63% ~01m 01s      
   |+++++++++++++++++++++++++++++++++                 | 64% ~59s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~57s          
   |++++++++++++++++++++++++++++++++++                | 66% ~56s          
   |++++++++++++++++++++++++++++++++++                | 67% ~54s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~52s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~50s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~49s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~47s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~45s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~43s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~41s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~39s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~37s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~35s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~33s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~32s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~30s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~28s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~26s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~24s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~22s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~09s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 46s
E15E16P1P4_wt_res14_BasalSecretory
For the purpose of visualization, we average within each specific cell type:
seurat_E15E16P1P4_wt<-SetAllIdent(object = seurat_E15E16P1P4_wt, id = "specific_type")
average_wt_specific_Annotation<-AverageExpression(object = seurat_E15E16P1P4_wt,return.seurat = T)
Finished averaging RNA for cluster Basal
Finished averaging RNA for cluster Chondrocyte
Finished averaging RNA for cluster CiliaSecretory
Finished averaging RNA for cluster Ciliated
Finished averaging RNA for cluster CyclingEpithelial
Finished averaging RNA for cluster CyclingFibroblast
Finished averaging RNA for cluster Doublet
Finished averaging RNA for cluster Fibroblast
Finished averaging RNA for cluster Immune_1
Finished averaging RNA for cluster Immune_2
Finished averaging RNA for cluster LymphaticEndothelial
Finished averaging RNA for cluster MesenchymalProgenitor
Finished averaging RNA for cluster Muscle
Finished averaging RNA for cluster Neuron/NEC
Finished averaging RNA for cluster RBC
Finished averaging RNA for cluster SchwannCell
Finished averaging RNA for cluster Secretory
Finished averaging RNA for cluster Thyroid
Finished averaging RNA for cluster Transitional
Finished averaging RNA for cluster VascularEndothelial
Finished averaging RNA for cluster VSMC/pericyte
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Scaling data matrix

  |                                                                                                                    
  |                                                                                                              |   0%
  |                                                                                                                    
  |==============================================================================================================| 100%

print(levels(seurat_E15E16P1P4_wt@ident))

epithlial cells across ages:

df_wt<-FetchData(seurat_E15E16P1P4_wt,c("Ano1","Cftr","Krt4","Krt13","res.1.4","age","seq_group","cell_type","specific_type"))

any possible ionocytes?:

table(df_all_wt$res.1.4[df_all_wt$Foxi1>0])

 0  1 10 11 12 13 14 15 16 17 18 19  2 20 21 22 23 24 25 26 27 28 29  3 30 31 32 33  4  5  6  7  8  9 
 0  0  0  0  0  0  2  0  1  1  0  0  2  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
table(df_all_wt$res.1.4[df_all_wt$Cftr>0 & df_all_wt$Foxi1>0])

 0  1 10 11 12 13 14 15 16 17 18 19  2 20 21 22 23 24 25 26 27 28 29  3 30 31 32 33  4  5  6  7  8  9 
 0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
epithelial cell composition across ages:

table(seurat_E15E16P1P4_wt@meta.data$age[seurat_E15E16P1P4_wt@meta.data$res.1.4 %in% c(11,8,3,9,1,29,30,2,7,20,27,28)],seurat_E15E16P1P4_wt@meta.data$cell_type[seurat_E15E16P1P4_wt@meta.data$res.1.4 %in% c(11,8,3,9,1,29,30,2,7,20,27,28)])
     
      Basal CiliaSecretory Ciliated CyclingEpithelial Secretory Transitional
  E15  1017              0        1              1155         0          601
  E16  1324              3      294               132      1094            0
  P1     60            117       73                 2       222            0
  P4     90             76      203                 8       413            0
a few lineage markers:

seurat_E15E16P1P4_wt=buildClusterTree(seurat_E15E16P1P4_wt,do.reorder = F,reorder.numeric = F,pcs.use = 1:24)
'buildClusterTree' is deprecated.
Use 'BuildClusterTree' instead.
See help("Deprecated") and help("Seurat-deprecated").Finished averaging RNA for cluster 0
Finished averaging RNA for cluster 1
Finished averaging RNA for cluster 2
Finished averaging RNA for cluster 3
Finished averaging RNA for cluster 4
Finished averaging RNA for cluster 5
Finished averaging RNA for cluster 6
Finished averaging RNA for cluster 7
Finished averaging RNA for cluster 8
Finished averaging RNA for cluster 9
Finished averaging RNA for cluster 10
Finished averaging RNA for cluster 11
Finished averaging RNA for cluster 12
Finished averaging RNA for cluster 13
Finished averaging RNA for cluster 14
Finished averaging RNA for cluster 15
Finished averaging RNA for cluster 16
Finished averaging RNA for cluster 17
Finished averaging RNA for cluster 18
Finished averaging RNA for cluster 19
Finished averaging RNA for cluster 20
Finished averaging RNA for cluster 21
Finished averaging RNA for cluster 22
Finished averaging RNA for cluster 23
Finished averaging RNA for cluster 24
Finished averaging RNA for cluster 25
Finished averaging RNA for cluster 26
Finished averaging RNA for cluster 27
Finished averaging RNA for cluster 28
Finished averaging RNA for cluster 29
Finished averaging RNA for cluster 30
Finished averaging RNA for cluster 31
Finished averaging RNA for cluster 32
Finished averaging RNA for cluster 33

potential mesenchymal progenitors:
E15E16P1P4_wt_res14_22over33<-FindMarkers(seurat_E15E16P1P4_wt,ident.1=c(22),ident.2 = c(33),only.pos = TRUE)
E15E16P1P4_wt_res14_22over33
E15E16P1P4_wt_res14_33over22<-FindMarkers(seurat_E15E16P1P4_wt,ident.1=c(33),ident.2 = c(22),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~07s          
   |++                                                | 2 % ~07s          
   |++                                                | 3 % ~07s          
   |+++                                               | 4 % ~07s          
   |+++                                               | 5 % ~13s          
   |++++                                              | 6 % ~12s          
   |++++                                              | 8 % ~11s          
   |+++++                                             | 9 % ~10s          
   |+++++                                             | 10% ~10s          
   |++++++                                            | 11% ~09s          
   |++++++                                            | 12% ~09s          
   |+++++++                                           | 13% ~09s          
   |+++++++                                           | 14% ~08s          
   |++++++++                                          | 15% ~08s          
   |+++++++++                                         | 16% ~08s          
   |+++++++++                                         | 17% ~08s          
   |++++++++++                                        | 18% ~07s          
   |++++++++++                                        | 19% ~07s          
   |+++++++++++                                       | 20% ~07s          
   |+++++++++++                                       | 22% ~07s          
   |++++++++++++                                      | 23% ~07s          
   |++++++++++++                                      | 24% ~07s          
   |+++++++++++++                                     | 25% ~06s          
   |+++++++++++++                                     | 26% ~06s          
   |++++++++++++++                                    | 27% ~06s          
   |++++++++++++++                                    | 28% ~06s          
   |+++++++++++++++                                   | 29% ~06s          
   |++++++++++++++++                                  | 30% ~06s          
   |++++++++++++++++                                  | 31% ~06s          
   |+++++++++++++++++                                 | 32% ~06s          
   |+++++++++++++++++                                 | 33% ~06s          
   |++++++++++++++++++                                | 34% ~05s          
   |++++++++++++++++++                                | 35% ~05s          
   |+++++++++++++++++++                               | 37% ~05s          
   |+++++++++++++++++++                               | 38% ~05s          
   |++++++++++++++++++++                              | 39% ~05s          
   |++++++++++++++++++++                              | 40% ~05s          
   |+++++++++++++++++++++                             | 41% ~05s          
   |+++++++++++++++++++++                             | 42% ~05s          
   |++++++++++++++++++++++                            | 43% ~05s          
   |+++++++++++++++++++++++                           | 44% ~04s          
   |+++++++++++++++++++++++                           | 45% ~04s          
   |++++++++++++++++++++++++                          | 46% ~04s          
   |++++++++++++++++++++++++                          | 47% ~04s          
   |+++++++++++++++++++++++++                         | 48% ~04s          
   |+++++++++++++++++++++++++                         | 49% ~04s          
   |++++++++++++++++++++++++++                        | 51% ~04s          
   |++++++++++++++++++++++++++                        | 52% ~04s          
   |+++++++++++++++++++++++++++                       | 53% ~04s          
   |+++++++++++++++++++++++++++                       | 54% ~04s          
   |++++++++++++++++++++++++++++                      | 55% ~04s          
   |++++++++++++++++++++++++++++                      | 56% ~03s          
   |+++++++++++++++++++++++++++++                     | 57% ~03s          
   |++++++++++++++++++++++++++++++                    | 58% ~03s          
   |++++++++++++++++++++++++++++++                    | 59% ~03s          
   |+++++++++++++++++++++++++++++++                   | 60% ~03s          
   |+++++++++++++++++++++++++++++++                   | 61% ~03s          
   |++++++++++++++++++++++++++++++++                  | 62% ~03s          
   |++++++++++++++++++++++++++++++++                  | 63% ~03s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
   |++++++++++++++++++++++++++++++++++                | 67% ~03s          
   |++++++++++++++++++++++++++++++++++                | 68% ~02s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 08s
E15E16P1P4_wt_res14_33over22
E15E16P1P4_wt_res14_25over22<-FindMarkers(seurat_E15E16P1P4_wt,ident.1=c(25),ident.2 = c(22),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~05s          
   |++                                                | 2 % ~04s          
   |++                                                | 4 % ~04s          
   |+++                                               | 5 % ~04s          
   |+++                                               | 6 % ~04s          
   |++++                                              | 7 % ~04s          
   |+++++                                             | 8 % ~04s          
   |+++++                                             | 9 % ~04s          
   |++++++                                            | 11% ~04s          
   |++++++                                            | 12% ~04s          
   |+++++++                                           | 13% ~04s          
   |++++++++                                          | 14% ~04s          
   |++++++++                                          | 15% ~04s          
   |+++++++++                                         | 16% ~04s          
   |+++++++++                                         | 18% ~04s          
   |++++++++++                                        | 19% ~04s          
   |++++++++++                                        | 20% ~04s          
   |+++++++++++                                       | 21% ~04s          
   |++++++++++++                                      | 22% ~03s          
   |++++++++++++                                      | 24% ~03s          
   |+++++++++++++                                     | 25% ~03s          
   |+++++++++++++                                     | 26% ~03s          
   |++++++++++++++                                    | 27% ~03s          
   |+++++++++++++++                                   | 28% ~03s          
   |+++++++++++++++                                   | 29% ~03s          
   |++++++++++++++++                                  | 31% ~03s          
   |++++++++++++++++                                  | 32% ~03s          
   |+++++++++++++++++                                 | 33% ~03s          
   |++++++++++++++++++                                | 34% ~03s          
   |++++++++++++++++++                                | 35% ~03s          
   |+++++++++++++++++++                               | 36% ~03s          
   |+++++++++++++++++++                               | 38% ~03s          
   |++++++++++++++++++++                              | 39% ~03s          
   |++++++++++++++++++++                              | 40% ~03s          
   |+++++++++++++++++++++                             | 41% ~03s          
   |++++++++++++++++++++++                            | 42% ~03s          
   |++++++++++++++++++++++                            | 44% ~03s          
   |+++++++++++++++++++++++                           | 45% ~03s          
   |+++++++++++++++++++++++                           | 46% ~02s          
   |++++++++++++++++++++++++                          | 47% ~02s          
   |+++++++++++++++++++++++++                         | 48% ~02s          
   |+++++++++++++++++++++++++                         | 49% ~02s          
   |++++++++++++++++++++++++++                        | 51% ~02s          
   |++++++++++++++++++++++++++                        | 52% ~02s          
   |+++++++++++++++++++++++++++                       | 53% ~02s          
   |++++++++++++++++++++++++++++                      | 54% ~02s          
   |++++++++++++++++++++++++++++                      | 55% ~02s          
   |+++++++++++++++++++++++++++++                     | 56% ~02s          
   |+++++++++++++++++++++++++++++                     | 58% ~02s          
   |++++++++++++++++++++++++++++++                    | 59% ~02s          
   |++++++++++++++++++++++++++++++                    | 60% ~02s          
   |+++++++++++++++++++++++++++++++                   | 61% ~02s          
   |++++++++++++++++++++++++++++++++                  | 62% ~02s          
   |++++++++++++++++++++++++++++++++                  | 64% ~02s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
   |++++++++++++++++++++++++++++++++++                | 67% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 05s
E15E16P1P4_wt_res14_25over22

scGPS (scoring):
head(geneList$Mucociliary)
[1] "Fcgr3"  "Dnah7c" "Dnah7b" "Dnah7a" "Mst1"   "Mst1r" 
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:plyr’:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
percentile_table_E15E16P1P4wt<-apply(seurat_E15E16P1P4_wt@data,1,percent_rank)
percentile_table_E15E16P1P4wt[1:6,1:6]
                               Xkr4 Gm1992 Gm37381       Rp1 Sox17 Gm37323
E16_Dec7_wt_1_AAACCTGAGATCCCGC    0      0       0 0.0000000     0       0
E16_Dec7_wt_1_AAACCTGAGGTGCAAC    0      0       0 0.0000000     0       0
E16_Dec7_wt_1_AAACCTGGTAAATGAC    0      0       0 0.0000000     0       0
E16_Dec7_wt_1_AAACCTGGTGATGCCC    0      0       0 0.0000000     0       0
E16_Dec7_wt_1_AAACCTGTCACATACG    0      0       0 0.0000000     0       0
E16_Dec7_wt_1_AAACCTGTCAGCGACC    0      0       0 0.9869705     0       0
 CellCycle_score_wt<- apply(percentile_table_E15E16P1P4wt[,colnames(percentile_table_E15E16P1P4wt) %in% geneList$Cell_cycle],1,mean)
 head( CellCycle_score_wt)
E16_Dec7_wt_1_AAACCTGAGATCCCGC E16_Dec7_wt_1_AAACCTGAGGTGCAAC E16_Dec7_wt_1_AAACCTGGTAAATGAC 
                    0.04833364                     0.10794933                     0.06216909 
E16_Dec7_wt_1_AAACCTGGTGATGCCC E16_Dec7_wt_1_AAACCTGTCACATACG E16_Dec7_wt_1_AAACCTGTCAGCGACC 
                    0.66890828                     0.10226353                     0.36390747 
seurat_E15E16P1P4_wt<-AddMetaData(object = seurat_E15E16P1P4_wt, metadata = CellCycle_score_wt, col.name = "CellCycle_score")
VlnPlot(object = seurat_E15E16P1P4_wt, features.plot = c("CellCycle_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")

wt_mocosaGoblet_score<- apply(percentile_table_E15E16P1P4wt[,colnames(percentile_table_E15E16P1P4wt) %in% geneList$Mucosa.epithelium.goblet],1,mean)
seurat_E15E16P1P4_wt<-AddMetaData(object = seurat_E15E16P1P4_wt, metadata = wt_mocosaGoblet_score, col.name = "mucosaGoblet_score")
VlnPlot(object = seurat_E15E16P1P4_wt, features.plot = c("mucosaGoblet_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")

 wt_ciliopathy_table<- percentile_table_E15E16P1P4wt[,colnames(percentile_table_E15E16P1P4wt) %in% geneList$Ciliopathy]
 wt_ciliopathy_score<- apply(wt_ciliopathy_table,1,mean)
 head(wt_ciliopathy_score)
seurat_E15E16P1P4_wt<-AddMetaData(object = seurat_E15E16P1P4_wt, metadata = wt_ciliopathy_score, col.name = "ciliopathy_score")

 wt_PCD_score<- apply(percentile_table_E15E16P1P4wt[,colnames(percentile_table_E15E16P1P4wt) %in% geneList$Primary.ciliary.dyskinesia],1,mean)
 head(wt_PCD_score)
E16_Dec7_wt_1_AAACCTGAGATCCCGC E16_Dec7_wt_1_AAACCTGAGGTGCAAC E16_Dec7_wt_1_AAACCTGGTAAATGAC 
                    0.07178531                     0.06811267                     0.05672251 
E16_Dec7_wt_1_AAACCTGGTGATGCCC E16_Dec7_wt_1_AAACCTGTCACATACG E16_Dec7_wt_1_AAACCTGTCAGCGACC 
                    0.09034630                     0.03588221                     0.66970120 
seurat_E15E16P1P4_wt<-AddMetaData(object = seurat_E15E16P1P4_wt, metadata = wt_PCD_score, col.name = "PCD_score")
VlnPlot(object = seurat_E15E16P1P4_wt, features.plot = c("PCD_score"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="res.1.4")

ggplot(seurat_E15E16P1P4_wt@meta.data[seurat_E15E16P1P4_wt@meta.data$specific_type %in% c("Secretory","CiliaSecretory"),],aes(age,mucosaGoblet_score))+facet_grid(.~specific_type)+geom_dotplot(binaxis="y",aes(fill=age),binwidth=0.01,stackdir="center",position=position_dodge(0.8), dotsize=0.2)+stat_compare_means(comparisons = list(c("E16", "P1"),c("P1", "P4"),c("E16", "P4")),method="wilcox.test",size=4,label="p.adj")+ stat_summary(aes(color=age),fun.data=mean_sdl, fun.args = list(mult=1), 
                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1),strip.text.x = element_text(size = 9, colour = "black", angle = 0))

 wt_bronchitis_score<- apply(percentile_table_E15E16P1P4wt[,colnames(percentile_table_E15E16P1P4wt) %in% geneList$Bronchiectasis.and.Bronchitis],1,mean)
 head(wt_bronchitis_score)
E16_Dec7_wt_1_AAACCTGAGATCCCGC E16_Dec7_wt_1_AAACCTGAGGTGCAAC E16_Dec7_wt_1_AAACCTGGTAAATGAC E16_Dec7_wt_1_AAACCTGGTGATGCCC 
                    0.05980333                     0.12838142                     0.10012107                     0.07827476 
E16_Dec7_wt_1_AAACCTGTCACATACG E16_Dec7_wt_1_AAACCTGTCAGCGACC 
                    0.09195436                     0.36792222 
seurat_E15E16P1P4_wt<-AddMetaData(object = seurat_E15E16P1P4_wt, metadata = wt_bronchitis_score, col.name = "Bronchiectasis_Bronchitis")

seurat_E15E16P1P4_wt<-SetAllIdent(seurat_E15E16P1P4_wt,id="specific_type")
VlnPlot(object = seurat_E15E16P1P4_wt, features.plot = c("Bronchiectasis_Bronchitis"), nCol = 1,x.lab.rot = T,point.size.use = 0.3,use.raw=F,group.by="specific_type",do.sort = F,ident.include = c("CyclingEpithelial","Basal","Transitional","Secretory","Ciliated","CiliaSecretory","Fibroblast","CyclingFibroblast","MesenchymalProgenitor","Chondrocyte","Muscle","VSMC/pericyte","LymphaticEndothelial","VascularEndothelial","Immune_1","Immune_2","SchwannCell","Neuron/NEC"))

 wt_COPD_score<- apply(percentile_table_E15E16P1P4wt[,colnames(percentile_table_E15E16P1P4wt) %in% geneList$COPD],1,mean)
 head(wt_COPD_score)
E16_Dec7_wt_1_AAACCTGAGATCCCGC E16_Dec7_wt_1_AAACCTGAGGTGCAAC E16_Dec7_wt_1_AAACCTGGTAAATGAC 
                     0.1345453                      0.1974387                      0.1539624 
E16_Dec7_wt_1_AAACCTGGTGATGCCC E16_Dec7_wt_1_AAACCTGTCACATACG E16_Dec7_wt_1_AAACCTGTCAGCGACC 
                     0.1719776                      0.1320101                      0.2590983 
seurat_E15E16P1P4_wt<-AddMetaData(object = seurat_E15E16P1P4_wt, metadata = wt_COPD_score, col.name = "COPD")

 wt_asthma_score<- apply(percentile_table_E15E16P1P4wt[,colnames(percentile_table_E15E16P1P4wt) %in% geneList$Pulmonary...Asthma],1,mean)
 head(wt_asthma_score)
E16_Dec7_wt_1_AAACCTGAGATCCCGC E16_Dec7_wt_1_AAACCTGAGGTGCAAC E16_Dec7_wt_1_AAACCTGGTAAATGAC 
                    0.08485814                     0.13134618                     0.09996662 
E16_Dec7_wt_1_AAACCTGGTGATGCCC E16_Dec7_wt_1_AAACCTGTCACATACG E16_Dec7_wt_1_AAACCTGTCAGCGACC 
                    0.09764181                     0.08522185                     0.14710912 
seurat_E15E16P1P4_wt<-AddMetaData(object = seurat_E15E16P1P4_wt, metadata = wt_asthma_score, col.name = "Asthma")

check some human GWAS:
seurat_E15E16P1P4_wt<-SetAllIdent(object = seurat_E15E16P1P4_wt, id = "specific_type")
seurat_E15E16P1P4_wt@ident = factor(seurat_E15E16P1P4_wt@ident,levels(seurat_E15E16P1P4_wt@ident)[c(5,1,19,17,4,3,14,16,20,11,9,10,13,21,12,2,8,6,18,15,7)])
DotPlot(object = seurat_E15E16P1P4_wt, cols.use = c("forestgreen","magenta3"),genes.plot = c("Muc4","Muc20","Agtr2","Slc6a14","Ehf","Apip","Hhip","Chrna5","Htr4","Adgrg6","Thsd4","Fam13a","Gstcd","Rin3","Adam19","Tet2","Eefsec","Cfdp1","Tgfb2","Ager","Sgf29","Armc2","Pid1","Dsp","Mtcl1","Rarb","Sftpd","Cyp2a4","Cyp2a5"),group.by = "ident", x.lab.rot = T,plot.legend = T)

CF GWAS:
seurat_E15E16P1P4_wt<-SetAllIdent(object = seurat_E15E16P1P4_wt, id = "specific_type")
seurat_E15E16P1P4_wt@ident = factor(seurat_E15E16P1P4_wt@ident,levels(seurat_E15E16P1P4_wt@ident)[c(5,1,19,17,4,3,14,16,20,11,9,10,13,21,12,2,8,6,18,15,7)])
DotPlot(object = seurat_E15E16P1P4_wt, cols.use = c("forestgreen","magenta3"),genes.plot = c("Muc4","Muc20","Agtr2","Slc6a14","Ehf","Aplp1","Aplp2","H2-Aa","H2-Ab1","H2-Eb1","H2-Eb2"),group.by = "ident", x.lab.rot = T,plot.legend = T)

COPD:

Developmental lanscape:
basal cells across time:
seurat_E15E16P1P4_wt <- SetAllIdent(object = seurat_E15E16P1P4_wt, id = "res.1.4")
E15E16P1P4_wt_res14_3over1<-FindMarkers(seurat_E15E16P1P4_wt,ident.1=c(3),ident.2 = c(1),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~30s          
   |++                                                | 2 % ~28s          
   |++                                                | 3 % ~27s          
   |+++                                               | 4 % ~26s          
   |+++                                               | 5 % ~25s          
   |++++                                              | 6 % ~25s          
   |++++                                              | 7 % ~24s          
   |+++++                                             | 8 % ~24s          
   |+++++                                             | 9 % ~24s          
   |++++++                                            | 10% ~23s          
   |++++++                                            | 11% ~28s          
   |+++++++                                           | 12% ~27s          
   |+++++++                                           | 13% ~27s          
   |++++++++                                          | 14% ~26s          
   |++++++++                                          | 15% ~26s          
   |+++++++++                                         | 16% ~25s          
   |+++++++++                                         | 17% ~25s          
   |++++++++++                                        | 18% ~24s          
   |++++++++++                                        | 19% ~24s          
   |+++++++++++                                       | 20% ~23s          
   |+++++++++++                                       | 21% ~23s          
   |++++++++++++                                      | 22% ~22s          
   |++++++++++++                                      | 23% ~22s          
   |+++++++++++++                                     | 24% ~22s          
   |+++++++++++++                                     | 26% ~21s          
   |++++++++++++++                                    | 27% ~21s          
   |++++++++++++++                                    | 28% ~21s          
   |+++++++++++++++                                   | 29% ~20s          
   |+++++++++++++++                                   | 30% ~20s          
   |++++++++++++++++                                  | 31% ~20s          
   |++++++++++++++++                                  | 32% ~19s          
   |+++++++++++++++++                                 | 33% ~19s          
   |+++++++++++++++++                                 | 34% ~19s          
   |++++++++++++++++++                                | 35% ~18s          
   |++++++++++++++++++                                | 36% ~18s          
   |+++++++++++++++++++                               | 37% ~18s          
   |+++++++++++++++++++                               | 38% ~17s          
   |++++++++++++++++++++                              | 39% ~17s          
   |++++++++++++++++++++                              | 40% ~17s          
   |+++++++++++++++++++++                             | 41% ~16s          
   |+++++++++++++++++++++                             | 42% ~16s          
   |++++++++++++++++++++++                            | 43% ~16s          
   |++++++++++++++++++++++                            | 44% ~15s          
   |+++++++++++++++++++++++                           | 45% ~15s          
   |+++++++++++++++++++++++                           | 46% ~15s          
   |++++++++++++++++++++++++                          | 47% ~15s          
   |++++++++++++++++++++++++                          | 48% ~14s          
   |+++++++++++++++++++++++++                         | 49% ~14s          
   |+++++++++++++++++++++++++                         | 50% ~14s          
   |++++++++++++++++++++++++++                        | 51% ~13s          
   |+++++++++++++++++++++++++++                       | 52% ~13s          
   |+++++++++++++++++++++++++++                       | 53% ~13s          
   |++++++++++++++++++++++++++++                      | 54% ~13s          
   |++++++++++++++++++++++++++++                      | 55% ~12s          
   |+++++++++++++++++++++++++++++                     | 56% ~12s          
   |+++++++++++++++++++++++++++++                     | 57% ~12s          
   |++++++++++++++++++++++++++++++                    | 58% ~11s          
   |++++++++++++++++++++++++++++++                    | 59% ~11s          
   |+++++++++++++++++++++++++++++++                   | 60% ~11s          
   |+++++++++++++++++++++++++++++++                   | 61% ~11s          
   |++++++++++++++++++++++++++++++++                  | 62% ~10s          
   |++++++++++++++++++++++++++++++++                  | 63% ~10s          
   |+++++++++++++++++++++++++++++++++                 | 64% ~10s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~09s          
   |++++++++++++++++++++++++++++++++++                | 66% ~09s          
   |++++++++++++++++++++++++++++++++++                | 67% ~09s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~09s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~08s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~08s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~08s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~07s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~07s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~07s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~07s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~06s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~06s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~06s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 27s
E15E16P1P4_wt_res14_3over1
write.table(E15E16P1P4_wt_res14_3over1,"E15E16P1P4_wt_res14_3over1.txt",sep="\t")
E15E16P1P4_wt_res14_1over3<-FindMarkers(seurat_E15E16P1P4_wt,ident.1=c(1),ident.2 = c(3),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~15s          
   |++                                                | 2 % ~14s          
   |++                                                | 3 % ~14s          
   |+++                                               | 5 % ~14s          
   |+++                                               | 6 % ~14s          
   |++++                                              | 7 % ~14s          
   |++++                                              | 8 % ~14s          
   |+++++                                             | 9 % ~14s          
   |++++++                                            | 10% ~13s          
   |++++++                                            | 11% ~13s          
   |+++++++                                           | 12% ~13s          
   |+++++++                                           | 14% ~13s          
   |++++++++                                          | 15% ~13s          
   |++++++++                                          | 16% ~12s          
   |+++++++++                                         | 17% ~12s          
   |++++++++++                                        | 18% ~12s          
   |++++++++++                                        | 19% ~12s          
   |+++++++++++                                       | 20% ~12s          
   |+++++++++++                                       | 22% ~12s          
   |++++++++++++                                      | 23% ~11s          
   |++++++++++++                                      | 24% ~11s          
   |+++++++++++++                                     | 25% ~11s          
   |++++++++++++++                                    | 26% ~11s          
   |++++++++++++++                                    | 27% ~11s          
   |+++++++++++++++                                   | 28% ~11s          
   |+++++++++++++++                                   | 30% ~10s          
   |++++++++++++++++                                  | 31% ~10s          
   |++++++++++++++++                                  | 32% ~10s          
   |+++++++++++++++++                                 | 33% ~10s          
   |++++++++++++++++++                                | 34% ~10s          
   |++++++++++++++++++                                | 35% ~09s          
   |+++++++++++++++++++                               | 36% ~09s          
   |+++++++++++++++++++                               | 38% ~09s          
   |++++++++++++++++++++                              | 39% ~09s          
   |++++++++++++++++++++                              | 40% ~09s          
   |+++++++++++++++++++++                             | 41% ~09s          
   |++++++++++++++++++++++                            | 42% ~09s          
   |++++++++++++++++++++++                            | 43% ~08s          
   |+++++++++++++++++++++++                           | 44% ~08s          
   |+++++++++++++++++++++++                           | 45% ~08s          
   |++++++++++++++++++++++++                          | 47% ~08s          
   |++++++++++++++++++++++++                          | 48% ~08s          
   |+++++++++++++++++++++++++                         | 49% ~08s          
   |+++++++++++++++++++++++++                         | 50% ~07s          
   |++++++++++++++++++++++++++                        | 51% ~07s          
   |+++++++++++++++++++++++++++                       | 52% ~07s          
   |+++++++++++++++++++++++++++                       | 53% ~07s          
   |++++++++++++++++++++++++++++                      | 55% ~07s          
   |++++++++++++++++++++++++++++                      | 56% ~07s          
   |+++++++++++++++++++++++++++++                     | 57% ~06s          
   |+++++++++++++++++++++++++++++                     | 58% ~06s          
   |++++++++++++++++++++++++++++++                    | 59% ~06s          
   |+++++++++++++++++++++++++++++++                   | 60% ~06s          
   |+++++++++++++++++++++++++++++++                   | 61% ~06s          
   |++++++++++++++++++++++++++++++++                  | 62% ~06s          
   |++++++++++++++++++++++++++++++++                  | 64% ~05s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
   |++++++++++++++++++++++++++++++++++                | 67% ~05s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~05s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~05s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~04s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~04s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~04s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~04s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~03s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 15s
E15E16P1P4_wt_res14_1over3
write.table(E15E16P1P4_wt_res14_1over3,"E15E16P1P4_wt_res14_1over3.txt",sep="\t")
E15E16P1P4_wt_res14_29over1<-FindMarkers(seurat_E15E16P1P4_wt,ident.1=c(29),ident.2 = c(1),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~10s          
   |++                                                | 2 % ~09s          
   |++                                                | 3 % ~09s          
   |+++                                               | 4 % ~09s          
   |+++                                               | 5 % ~09s          
   |++++                                              | 6 % ~09s          
   |++++                                              | 8 % ~09s          
   |+++++                                             | 9 % ~09s          
   |+++++                                             | 10% ~09s          
   |++++++                                            | 11% ~09s          
   |++++++                                            | 12% ~08s          
   |+++++++                                           | 13% ~08s          
   |+++++++                                           | 14% ~08s          
   |++++++++                                          | 15% ~08s          
   |+++++++++                                         | 16% ~08s          
   |+++++++++                                         | 17% ~08s          
   |++++++++++                                        | 18% ~08s          
   |++++++++++                                        | 19% ~08s          
   |+++++++++++                                       | 20% ~08s          
   |+++++++++++                                       | 22% ~08s          
   |++++++++++++                                      | 23% ~07s          
   |++++++++++++                                      | 24% ~07s          
   |+++++++++++++                                     | 25% ~07s          
   |+++++++++++++                                     | 26% ~07s          
   |++++++++++++++                                    | 27% ~07s          
   |++++++++++++++                                    | 28% ~07s          
   |+++++++++++++++                                   | 29% ~07s          
   |++++++++++++++++                                  | 30% ~07s          
   |++++++++++++++++                                  | 31% ~07s          
   |+++++++++++++++++                                 | 32% ~06s          
   |+++++++++++++++++                                 | 33% ~06s          
   |++++++++++++++++++                                | 34% ~06s          
   |++++++++++++++++++                                | 35% ~06s          
   |+++++++++++++++++++                               | 37% ~06s          
   |+++++++++++++++++++                               | 38% ~06s          
   |++++++++++++++++++++                              | 39% ~06s          
   |++++++++++++++++++++                              | 40% ~06s          
   |+++++++++++++++++++++                             | 41% ~06s          
   |+++++++++++++++++++++                             | 42% ~06s          
   |++++++++++++++++++++++                            | 43% ~05s          
   |+++++++++++++++++++++++                           | 44% ~05s          
   |+++++++++++++++++++++++                           | 45% ~05s          
   |++++++++++++++++++++++++                          | 46% ~05s          
   |++++++++++++++++++++++++                          | 47% ~05s          
   |+++++++++++++++++++++++++                         | 48% ~05s          
   |+++++++++++++++++++++++++                         | 49% ~05s          
   |++++++++++++++++++++++++++                        | 51% ~05s          
   |++++++++++++++++++++++++++                        | 52% ~05s          
   |+++++++++++++++++++++++++++                       | 53% ~05s          
   |+++++++++++++++++++++++++++                       | 54% ~04s          
   |++++++++++++++++++++++++++++                      | 55% ~04s          
   |++++++++++++++++++++++++++++                      | 56% ~04s          
   |+++++++++++++++++++++++++++++                     | 57% ~04s          
   |++++++++++++++++++++++++++++++                    | 58% ~04s          
   |++++++++++++++++++++++++++++++                    | 59% ~04s          
   |+++++++++++++++++++++++++++++++                   | 60% ~04s          
   |+++++++++++++++++++++++++++++++                   | 61% ~04s          
   |++++++++++++++++++++++++++++++++                  | 62% ~04s          
   |++++++++++++++++++++++++++++++++                  | 63% ~03s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
   |++++++++++++++++++++++++++++++++++                | 67% ~03s          
   |++++++++++++++++++++++++++++++++++                | 68% ~03s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~03s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~03s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 09s
E15E16P1P4_wt_res14_29over1

df_3_1_29_wt<-FetchData(seurat_E15E16P1P4_wt,c("Trp63","Cldn6","Nnat","Id2","Id3","Wnt7b","Wnt4","Krt5","Krt15","Aqp3","Aqp4","Aqp5","Rpl6l","Rpl9-ps6","Rpl13-ps3","age","res.1.4"))
df_3_1_29_wt<-df_3_1_29_wt[order(factor(df_3_1_29_wt$res.1.4,levels=c("3","1","29")),df_3_1_29_wt$age),]
age<-substr(rownames(df_3_1_29_wt[df_3_1_29_wt$res.1.4 %in% c(3,1,29),]),1,3)
table(seurat_E15E16P1P4_wt@meta.data$res.1.4)

   0    1   10   11   12   13   14   15   16   17   18   19    2   20   21   22   23   24   25   26   27 
1347 1324  557  552  531  506  493  474  462  448  395  388 1094  362  342  317  272  245  222  221  209 
  28   29    3   30   31   32   33    4    5    6    7    8    9 
 196  149 1018  137  134   89   88  916  744  733  635  608  601 
library(gplots)
heatmap.2(t(as.matrix(df_3_1_29_wt[df_3_1_29_wt$res.1.4 %in% c(3,1,29),1:15])),col=plasma(500), scale="row",Colv = NA, Rowv = NA,ColSideColors=c("#006d2c","#2ca25f","#66c2a4","#99d8c9")[as.numeric(as.factor(age))],labCol =NA,density.info="none",trace="none",dendrogram='none',srtCol=45,cexCol = 1,colsep=c(1018,2342),breaks=seq(-3,3,length.out=501))
Using scale="row" or scale="column" when breaks arespecified can produce unpredictable results.Please consider using only one or the other.
par(lend = 1)           # square line ends for the color legend
legend("left",      # location of the legend on the heatmap plot
    legend = c("E15", "E16", "P1","P4"), # category labels
    col = c("#006d2c","#2ca25f","#66c2a4","#99d8c9"),  # color key
    lty= 1,             # line style
    lwd = 10            # line width
)

library(gplots)
heatmap.2(t(as.matrix(df_3_1_29_wt[df_3_1_29_wt$res.1.4 %in% c(3,1,29),1:15])),col=cividis(500), scale="row",Colv = NA, Rowv = NA,ColSideColors=c("#006d2c","#2ca25f","#66c2a4","#99d8c9")[as.numeric(as.factor(age))],labCol =NA,density.info="none",trace="none",dendrogram='none',srtCol=45,cexCol = 1,colsep=c(1018,2342),breaks=seq(-3,3,length.out=501))
Using scale="row" or scale="column" when breaks arespecified can produce unpredictable results.Please consider using only one or the other.
par(lend = 1)           # square line ends for the color legend
legend("left",      # location of the legend on the heatmap plot
    legend = c("E15", "E16", "P1","P4"), # category labels
    col = c("#006d2c","#2ca25f","#66c2a4","#99d8c9"),  # color key
    lty= 1,             # line style
    lwd = 10            # line width
)

pdf(file = paste("Manuscript/heatmap/","basal_dev",".pdf", sep = ""), width = 7, height = 3)
heatmap.2(t(as.matrix(df_3_1_29_wt[df_3_1_29_wt$res.1.4 %in% c(3,1,29),1:15])),col=cividis(500), scale="row",Colv = NA, Rowv = NA,ColSideColors=c("#006d2c","#2ca25f","#66c2a4","#99d8c9")[as.numeric(as.factor(age))],labCol =NA,density.info="none",trace="none",dendrogram='none',srtCol=45,cexCol = 1,colsep=c(1018,2342),breaks=seq(-3,3,length.out=501))
Using scale="row" or scale="column" when breaks arespecified can produce unpredictable results.Please consider using only one or the other.Error in plot.new() : figure margins too large
ggplot(data=seurat_E15E16P1P4_wt@meta.data[seurat_E15E16P1P4_wt@meta.data$res.1.4 %in% c(3,1,29),],aes(res.1.4,fill=age))+ 
    geom_bar(position="fill")+ theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  scale_fill_manual(values = c("#006d2c","#2ca25f","#66c2a4","#99d8c9"))+scale_x_discrete(limits=c("3","1","29"))

ciliated cells across time:
E15E16P1P4_wt_res14_27over20<-FindMarkers(seurat_E15E16P1P4_wt,ident.1=c(27),ident.2 = c(20),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~12s          
   |++                                                | 2 % ~12s          
   |++                                                | 3 % ~11s          
   |+++                                               | 4 % ~11s          
   |+++                                               | 5 % ~11s          
   |++++                                              | 6 % ~11s          
   |++++                                              | 8 % ~11s          
   |+++++                                             | 9 % ~11s          
   |+++++                                             | 10% ~11s          
   |++++++                                            | 11% ~11s          
   |++++++                                            | 12% ~10s          
   |+++++++                                           | 13% ~10s          
   |+++++++                                           | 14% ~10s          
   |++++++++                                          | 15% ~10s          
   |+++++++++                                         | 16% ~10s          
   |+++++++++                                         | 17% ~10s          
   |++++++++++                                        | 18% ~10s          
   |++++++++++                                        | 19% ~10s          
   |+++++++++++                                       | 20% ~10s          
   |+++++++++++                                       | 22% ~09s          
   |++++++++++++                                      | 23% ~09s          
   |++++++++++++                                      | 24% ~09s          
   |+++++++++++++                                     | 25% ~09s          
   |+++++++++++++                                     | 26% ~09s          
   |++++++++++++++                                    | 27% ~09s          
   |++++++++++++++                                    | 28% ~09s          
   |+++++++++++++++                                   | 29% ~09s          
   |++++++++++++++++                                  | 30% ~09s          
   |++++++++++++++++                                  | 31% ~09s          
   |+++++++++++++++++                                 | 32% ~08s          
   |+++++++++++++++++                                 | 33% ~08s          
   |++++++++++++++++++                                | 34% ~08s          
   |++++++++++++++++++                                | 35% ~08s          
   |+++++++++++++++++++                               | 37% ~08s          
   |+++++++++++++++++++                               | 38% ~08s          
   |++++++++++++++++++++                              | 39% ~08s          
   |++++++++++++++++++++                              | 40% ~07s          
   |+++++++++++++++++++++                             | 41% ~07s          
   |+++++++++++++++++++++                             | 42% ~07s          
   |++++++++++++++++++++++                            | 43% ~07s          
   |+++++++++++++++++++++++                           | 44% ~07s          
   |+++++++++++++++++++++++                           | 45% ~07s          
   |++++++++++++++++++++++++                          | 46% ~07s          
   |++++++++++++++++++++++++                          | 47% ~06s          
   |+++++++++++++++++++++++++                         | 48% ~06s          
   |+++++++++++++++++++++++++                         | 49% ~06s          
   |++++++++++++++++++++++++++                        | 51% ~06s          
   |++++++++++++++++++++++++++                        | 52% ~06s          
   |+++++++++++++++++++++++++++                       | 53% ~06s          
   |+++++++++++++++++++++++++++                       | 54% ~06s          
   |++++++++++++++++++++++++++++                      | 55% ~05s          
   |++++++++++++++++++++++++++++                      | 56% ~05s          
   |+++++++++++++++++++++++++++++                     | 57% ~05s          
   |++++++++++++++++++++++++++++++                    | 58% ~05s          
   |++++++++++++++++++++++++++++++                    | 59% ~05s          
   |+++++++++++++++++++++++++++++++                   | 60% ~05s          
   |+++++++++++++++++++++++++++++++                   | 61% ~05s          
   |++++++++++++++++++++++++++++++++                  | 62% ~05s          
   |++++++++++++++++++++++++++++++++                  | 63% ~04s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
   |++++++++++++++++++++++++++++++++++                | 67% ~04s          
   |++++++++++++++++++++++++++++++++++                | 68% ~04s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~04s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~03s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~03s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~03s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~03s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 12s
E15E16P1P4_wt_res14_27over20
write.table(E15E16P1P4_wt_res14_27over20,"E15E16P1P4_wt_res14_27over20.txt",sep="\t")
E15E16P1P4_wt_res14_20over27<-FindMarkers(seurat_E15E16P1P4_wt,ident.1=c(20),ident.2 = c(27),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~13s          
   |++                                                | 2 % ~13s          
   |++                                                | 3 % ~11s          
   |+++                                               | 4 % ~10s          
   |+++                                               | 5 % ~10s          
   |++++                                              | 6 % ~10s          
   |++++                                              | 8 % ~10s          
   |+++++                                             | 9 % ~09s          
   |+++++                                             | 10% ~09s          
   |++++++                                            | 11% ~09s          
   |++++++                                            | 12% ~09s          
   |+++++++                                           | 13% ~08s          
   |+++++++                                           | 14% ~09s          
   |++++++++                                          | 15% ~08s          
   |+++++++++                                         | 16% ~08s          
   |+++++++++                                         | 17% ~08s          
   |++++++++++                                        | 18% ~08s          
   |++++++++++                                        | 19% ~08s          
   |+++++++++++                                       | 20% ~08s          
   |+++++++++++                                       | 22% ~08s          
   |++++++++++++                                      | 23% ~07s          
   |++++++++++++                                      | 24% ~07s          
   |+++++++++++++                                     | 25% ~07s          
   |+++++++++++++                                     | 26% ~07s          
   |++++++++++++++                                    | 27% ~07s          
   |++++++++++++++                                    | 28% ~07s          
   |+++++++++++++++                                   | 29% ~07s          
   |++++++++++++++++                                  | 30% ~07s          
   |++++++++++++++++                                  | 31% ~07s          
   |+++++++++++++++++                                 | 32% ~06s          
   |+++++++++++++++++                                 | 33% ~06s          
   |++++++++++++++++++                                | 34% ~06s          
   |++++++++++++++++++                                | 35% ~06s          
   |+++++++++++++++++++                               | 37% ~06s          
   |+++++++++++++++++++                               | 38% ~06s          
   |++++++++++++++++++++                              | 39% ~06s          
   |++++++++++++++++++++                              | 40% ~06s          
   |+++++++++++++++++++++                             | 41% ~06s          
   |+++++++++++++++++++++                             | 42% ~05s          
   |++++++++++++++++++++++                            | 43% ~05s          
   |+++++++++++++++++++++++                           | 44% ~05s          
   |+++++++++++++++++++++++                           | 45% ~05s          
   |++++++++++++++++++++++++                          | 46% ~05s          
   |++++++++++++++++++++++++                          | 47% ~05s          
   |+++++++++++++++++++++++++                         | 48% ~05s          
   |+++++++++++++++++++++++++                         | 49% ~05s          
   |++++++++++++++++++++++++++                        | 51% ~05s          
   |++++++++++++++++++++++++++                        | 52% ~04s          
   |+++++++++++++++++++++++++++                       | 53% ~04s          
   |+++++++++++++++++++++++++++                       | 54% ~04s          
   |++++++++++++++++++++++++++++                      | 55% ~04s          
   |++++++++++++++++++++++++++++                      | 56% ~04s          
   |+++++++++++++++++++++++++++++                     | 57% ~04s          
   |++++++++++++++++++++++++++++++                    | 58% ~04s          
   |++++++++++++++++++++++++++++++                    | 59% ~04s          
   |+++++++++++++++++++++++++++++++                   | 60% ~04s          
   |+++++++++++++++++++++++++++++++                   | 61% ~04s          
   |++++++++++++++++++++++++++++++++                  | 62% ~04s          
   |++++++++++++++++++++++++++++++++                  | 63% ~03s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
   |++++++++++++++++++++++++++++++++++                | 67% ~03s          
   |++++++++++++++++++++++++++++++++++                | 68% ~03s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~03s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~03s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 09s
E15E16P1P4_wt_res14_20over27
write.table(E15E16P1P4_wt_res14_20over27,"E15E16P1P4_wt_res14_20over27.txt",sep="\t")

table(seurat_E15E16P1P4_wt@meta.data$res.1.4)

   0    1   10   11   12   13   14   15   16   17   18   19    2   20   21   22   23   24   25   26   27 
1347 1324  557  552  531  506  493  474  462  448  395  388 1094  362  342  317  272  245  222  221  209 
  28   29    3   30   31   32   33    4    5    6    7    8    9 
 196  149 1018  137  134   89   88  916  744  733  635  608  601 
df_20_27_wt<-FetchData(seurat_E15E16P1P4_wt,c("Foxj1","Lrrc23","Ccdc67","Cep152","Plk4","Ccna1","Ccno","Cdc20b","Cdc20","Hyls1","Mcidas","Smim24","Ift80","Prr18","Sntn","Stmnd1","Ldlrad1","Cdhr4","Cdhr3","Slc23a2","Ly6a","Ly6c1","Adam8","Cxcl17","Ifitm1","age","res.1.4"))
df_20_27_wt<-df_20_27_wt[order(df_20_27_wt$res.1.4,df_20_27_wt$age),]
age<-substr(rownames(df_20_27_wt[df_20_27_wt$res.1.4 %in% c(20,27),]),1,3)
library(gplots)
heatmap.2(t(as.matrix(df_20_27_wt[df_20_27_wt$res.1.4 %in% c(20,27),1:25])),col=plasma(500), scale="row",Colv = NA, Rowv = NA,ColSideColors=c("#006d2c","#2ca25f","#66c2a4","#99d8c9")[as.numeric(as.factor(age))],labCol =NA,density.info="none",trace="none",dendrogram='none',srtCol=45,cexCol = 1,colsep=c(362),breaks=seq(-3,3,length.out=501))
Using scale="row" or scale="column" when breaks arespecified can produce unpredictable results.Please consider using only one or the other.
par(lend = 1)           # square line ends for the color legend
legend("left",      # location of the legend on the heatmap plot
    legend = c("E15", "E16", "P1","P4"), # category labels
    col = c("#006d2c","#2ca25f","#66c2a4","#99d8c9"),  # color key
    lty= 1,             # line style
    lwd = 10            # line width
)

library(gplots)
heatmap.2(t(as.matrix(df_20_27_wt[df_20_27_wt$res.1.4 %in% c(20,27),1:22])),col=cividis(500), scale="row",Colv = NA, Rowv = NA,ColSideColors=c("#006d2c","#2ca25f","#66c2a4","#99d8c9")[as.numeric(as.factor(age))],labCol =NA,density.info="none",trace="none",dendrogram='none',srtCol=45,cexCol = 1,colsep=c(362),breaks=seq(-3,3,length.out=501))
Using scale="row" or scale="column" when breaks arespecified can produce unpredictable results.Please consider using only one or the other.
par(lend = 1)           # square line ends for the color legend
legend("left",      # location of the legend on the heatmap plot
    legend = c("E15", "E16", "P1","P4"), # category labels
    col = c("#006d2c","#2ca25f","#66c2a4","#99d8c9"),  # color key
    lty= 1,             # line style
    lwd = 10            # line width
)

table(seurat_E15E16P1P4_wt@meta.data$res.1.4[seurat_E15E16P1P4_wt@meta.data$res.1.4 %in% c(20,27)],seurat_E15E16P1P4_wt@meta.data$age[seurat_E15E16P1P4_wt@meta.data$res.1.4 %in% c(20,27)])
prop.table(table(seurat_E15E16P1P4_wt@meta.data$age[seurat_E15E16P1P4_wt@meta.data$res.1.4 %in% c(20,27)],seurat_E15E16P1P4_wt@meta.data$res.1.4[seurat_E15E16P1P4_wt@meta.data$res.1.4 %in% c(20,27)]),1)
     
              20         27
  E15 1.00000000 0.00000000
  E16 0.98979592 0.01020408
  P1  0.19178082 0.80821918
  P4  0.27586207 0.72413793

secretory cells across time:
E15E16P1P4_wt_res14_2over7<-FindMarkers(seurat_E15E16P1P4_wt,ident.1=c(2),ident.2 = c(7),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~16s          
   |++                                                | 2 % ~16s          
   |++                                                | 3 % ~16s          
   |+++                                               | 4 % ~15s          
   |+++                                               | 5 % ~15s          
   |++++                                              | 6 % ~15s          
   |++++                                              | 7 % ~15s          
   |+++++                                             | 8 % ~15s          
   |+++++                                             | 9 % ~14s          
   |++++++                                            | 10% ~14s          
   |++++++                                            | 11% ~14s          
   |+++++++                                           | 12% ~14s          
   |+++++++                                           | 13% ~14s          
   |++++++++                                          | 14% ~14s          
   |++++++++                                          | 15% ~14s          
   |+++++++++                                         | 16% ~13s          
   |+++++++++                                         | 17% ~13s          
   |++++++++++                                        | 18% ~13s          
   |++++++++++                                        | 19% ~13s          
   |+++++++++++                                       | 20% ~13s          
   |+++++++++++                                       | 21% ~13s          
   |++++++++++++                                      | 22% ~12s          
   |++++++++++++                                      | 23% ~12s          
   |+++++++++++++                                     | 24% ~12s          
   |+++++++++++++                                     | 25% ~12s          
   |++++++++++++++                                    | 26% ~12s          
   |++++++++++++++                                    | 27% ~12s          
   |+++++++++++++++                                   | 28% ~11s          
   |+++++++++++++++                                   | 29% ~11s          
   |++++++++++++++++                                  | 30% ~11s          
   |++++++++++++++++                                  | 31% ~11s          
   |+++++++++++++++++                                 | 32% ~11s          
   |+++++++++++++++++                                 | 33% ~11s          
   |++++++++++++++++++                                | 34% ~10s          
   |++++++++++++++++++                                | 35% ~10s          
   |+++++++++++++++++++                               | 36% ~10s          
   |+++++++++++++++++++                               | 37% ~10s          
   |++++++++++++++++++++                              | 38% ~10s          
   |++++++++++++++++++++                              | 39% ~10s          
   |+++++++++++++++++++++                             | 40% ~10s          
   |+++++++++++++++++++++                             | 41% ~09s          
   |++++++++++++++++++++++                            | 42% ~09s          
   |++++++++++++++++++++++                            | 43% ~09s          
   |+++++++++++++++++++++++                           | 44% ~09s          
   |+++++++++++++++++++++++                           | 45% ~09s          
   |++++++++++++++++++++++++                          | 46% ~09s          
   |++++++++++++++++++++++++                          | 47% ~08s          
   |+++++++++++++++++++++++++                         | 48% ~08s          
   |+++++++++++++++++++++++++                         | 49% ~08s          
   |++++++++++++++++++++++++++                        | 51% ~08s          
   |++++++++++++++++++++++++++                        | 52% ~08s          
   |+++++++++++++++++++++++++++                       | 53% ~08s          
   |+++++++++++++++++++++++++++                       | 54% ~07s          
   |++++++++++++++++++++++++++++                      | 55% ~07s          
   |++++++++++++++++++++++++++++                      | 56% ~07s          
   |+++++++++++++++++++++++++++++                     | 57% ~07s          
   |+++++++++++++++++++++++++++++                     | 58% ~07s          
   |++++++++++++++++++++++++++++++                    | 59% ~07s          
   |++++++++++++++++++++++++++++++                    | 60% ~06s          
   |+++++++++++++++++++++++++++++++                   | 61% ~06s          
   |+++++++++++++++++++++++++++++++                   | 62% ~06s          
   |++++++++++++++++++++++++++++++++                  | 63% ~06s          
   |++++++++++++++++++++++++++++++++                  | 64% ~06s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~06s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
   |++++++++++++++++++++++++++++++++++                | 67% ~05s          
   |++++++++++++++++++++++++++++++++++                | 68% ~05s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~05s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~05s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~05s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~04s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~04s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~04s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 16s
E15E16P1P4_wt_res14_2over7
E15E16P1P4_wt_res14_7over2<-FindMarkers(seurat_E15E16P1P4_wt,ident.1=c(7),ident.2 = c(2),only.pos = TRUE)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~06s          
   |++                                                | 2 % ~06s          
   |++                                                | 3 % ~05s          
   |+++                                               | 4 % ~05s          
   |+++                                               | 5 % ~05s          
   |++++                                              | 6 % ~05s          
   |++++                                              | 8 % ~05s          
   |+++++                                             | 9 % ~05s          
   |+++++                                             | 10% ~05s          
   |++++++                                            | 11% ~05s          
   |++++++                                            | 12% ~05s          
   |+++++++                                           | 13% ~05s          
   |+++++++                                           | 14% ~05s          
   |++++++++                                          | 15% ~05s          
   |+++++++++                                         | 16% ~05s          
   |+++++++++                                         | 17% ~05s          
   |++++++++++                                        | 18% ~05s          
   |++++++++++                                        | 19% ~04s          
   |+++++++++++                                       | 20% ~04s          
   |+++++++++++                                       | 22% ~04s          
   |++++++++++++                                      | 23% ~04s          
   |++++++++++++                                      | 24% ~04s          
   |+++++++++++++                                     | 25% ~04s          
   |+++++++++++++                                     | 26% ~04s          
   |++++++++++++++                                    | 27% ~04s          
   |++++++++++++++                                    | 28% ~04s          
   |+++++++++++++++                                   | 29% ~04s          
   |++++++++++++++++                                  | 30% ~04s          
   |++++++++++++++++                                  | 31% ~04s          
   |+++++++++++++++++                                 | 32% ~04s          
   |+++++++++++++++++                                 | 33% ~04s          
   |++++++++++++++++++                                | 34% ~04s          
   |++++++++++++++++++                                | 35% ~04s          
   |+++++++++++++++++++                               | 37% ~04s          
   |+++++++++++++++++++                               | 38% ~03s          
   |++++++++++++++++++++                              | 39% ~03s          
   |++++++++++++++++++++                              | 40% ~03s          
   |+++++++++++++++++++++                             | 41% ~03s          
   |+++++++++++++++++++++                             | 42% ~03s          
   |++++++++++++++++++++++                            | 43% ~03s          
   |+++++++++++++++++++++++                           | 44% ~03s          
   |+++++++++++++++++++++++                           | 45% ~03s          
   |++++++++++++++++++++++++                          | 46% ~03s          
   |++++++++++++++++++++++++                          | 47% ~03s          
   |+++++++++++++++++++++++++                         | 48% ~03s          
   |+++++++++++++++++++++++++                         | 49% ~03s          
   |++++++++++++++++++++++++++                        | 51% ~03s          
   |++++++++++++++++++++++++++                        | 52% ~03s          
   |+++++++++++++++++++++++++++                       | 53% ~03s          
   |+++++++++++++++++++++++++++                       | 54% ~03s          
   |++++++++++++++++++++++++++++                      | 55% ~03s          
   |++++++++++++++++++++++++++++                      | 56% ~02s          
   |+++++++++++++++++++++++++++++                     | 57% ~02s          
   |++++++++++++++++++++++++++++++                    | 58% ~02s          
   |++++++++++++++++++++++++++++++                    | 59% ~02s          
   |+++++++++++++++++++++++++++++++                   | 60% ~02s          
   |+++++++++++++++++++++++++++++++                   | 61% ~02s          
   |++++++++++++++++++++++++++++++++                  | 62% ~02s          
   |++++++++++++++++++++++++++++++++                  | 63% ~02s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
   |++++++++++++++++++++++++++++++++++                | 67% ~02s          
   |++++++++++++++++++++++++++++++++++                | 68% ~02s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 06s
E15E16P1P4_wt_res14_7over2

df_2_7_wt<-FetchData(seurat_E15E16P1P4_wt,c("Spdef","Creb3l1","Cited1","Dnajb9","Klk10","Klk13","Klk11","Muc5b","Muc1","Muc4","Gp2","Tff2","Sftpd","Scgb1a1","age","res.1.4"))
df_2_7_wt<-df_2_7_wt[order(df_2_7_wt$res.1.4,df_2_7_wt$age),]
age<-substr(rownames(df_2_7_wt[df_2_7_wt$res.1.4 %in% c(2,7),]),1,3)
table(seurat_E15E16P1P4_wt@meta.data$res.1.4)

   0    1   10   11   12   13   14   15   16   17   18   19    2   20   21   22   23   24   25   26   27 
1347 1324  557  552  531  506  493  474  462  448  395  388 1094  362  342  317  272  245  222  221  209 
  28   29    3   30   31   32   33    4    5    6    7    8    9 
 196  149 1018  137  134   89   88  916  744  733  635  608  601 
library(gplots)
heatmap.2(t(as.matrix(df_2_7_wt[df_2_7_wt$res.1.4 %in% c(2,7),1:14])),col=plasma(500), scale="row",Colv = NA, Rowv = NA,ColSideColors=c("#2ca25f","#66c2a4","#99d8c9")[as.numeric(as.factor(age))],labCol =NA,density.info="none",trace="none",dendrogram='none',srtCol=45,cexCol = 1,colsep=c(1094),breaks=seq(-3,3,length.out=501))
Using scale="row" or scale="column" when breaks arespecified can produce unpredictable results.Please consider using only one or the other.
par(lend = 1)           # square line ends for the color legend
legend("left",      # location of the legend on the heatmap plot
    legend = c( "E16", "P1","P4"), # category labels
    col = c("#2ca25f","#66c2a4","#99d8c9"),  # color key
    lty= 1,             # line style
    lwd = 10            # line width
)

library(gplots)
heatmap.2(t(as.matrix(df_2_7_wt[df_2_7_wt$res.1.4 %in% c(2,7),1:14])),col=cividis(500), scale="row",Colv = NA, Rowv = NA,ColSideColors=c("#2ca25f","#66c2a4","#99d8c9")[as.numeric(as.factor(age))],labCol =NA,density.info="none",trace="none",dendrogram='none',srtCol=45,cexCol = 1,colsep=c(1094),breaks=seq(-3,3,length.out=501))
Using scale="row" or scale="column" when breaks arespecified can produce unpredictable results.Please consider using only one or the other.
par(lend = 1)           # square line ends for the color legend
legend("left",      # location of the legend on the heatmap plot
    legend = c( "E16", "P1","P4"), # category labels
    col = c("#2ca25f","#66c2a4","#99d8c9"),  # color key
    lty= 1,             # line style
    lwd = 10            # line width
)

ggplot(data=seurat_E15E16P1P4_wt@meta.data[seurat_E15E16P1P4_wt@meta.data$res.1.4 %in% c(2,7),],aes(res.1.4,fill=age))+ 
    geom_bar(position="fill")+ theme(axis.text.x = element_text(angle = 45, hjust = 1))+ 
  scale_x_discrete(limits=c("2","7"))+
  scale_fill_manual(values = c("#2ca25f","#66c2a4","#99d8c9"))

seurat_E15E16P1P4_wt<-SetAllIdent(object = seurat_E15E16P1P4_wt, id = "res.1.4")
VlnPlot(object = seurat_E15E16P1P4_wt, features.plot = c("Foxj1","Mcidas","Cdhr3","Creb3l1","Spdef","Gp2"), nCol = 3,x.lab.rot = T,point.size.use = 0.1,use.raw=F,group.by="specific_type",ident.include =c(2,7,20,27,28) )

immune response:
Toll like receptors and signaling:

CLRs (C-type lectin domain):

NLR:

RLR:

df_all_wt<-FetchData(seurat_E15E16P1P4_wt,c("Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Reg3g","Lgals3","Nod1","Nod2","Nlrp6","Ddx58","Ifih1","Dhx58","Sucnr1","res.1.4","age","seq_group","cell_type","Foxj1","Spdef","Foxa3","Creb3l1","Gp2","Tff2","Scgb1a1","Cftr","Foxi1","Gja1","Muc1","Muc4","Muc16","Muc20","Muc5b","Muc5ac","Muc2","Defb1","Lyz2","Ltf","Sftpa1","Sftpd","Sftpb","Slpi","Lcn2","Pigr","Chil4","Ccl5","Cxcl10","Cxcl2","Cxcl1","Pf4","Cxcl12","Cxcl14","Cxcl15","Cxcl16","Cxcl17","Ccl2","Ccl7","Ccl17","Ccl20","Ccl21a","Ccl25","Ccl27a","Ccl28","Cx3cl1","Il10","Tnf","S100a8","S100a9","Il6","Il18","Il1b","Il1rl1","Ccl11","Ccl24","Il33","Il25","Tslp","F2rl1","Retnla","Alox15","Alox5","Gata2","Tgfb2","Tgfb1","Ormdl3","Ptges","Ptgds","Ptgs2","Hpgds","Tbxas1","Areg","Il2","Il17b","Il17d","Il34","Il11","Il15","Ifnk","Ifnlr1","Ifkbiz","Ifkbia"))
Error in FetchData(seurat_E15E16P1P4_wt, c("Lbp", "Cd14", "Tlr4", "Tlr2",  : 
  Error: Ifkbiz not found
table(colnames(df_all_wt))

      age    Alox15     Alox5      Areg     Ccl11     Ccl17      Ccl2     Ccl20    Ccl21a     Ccl24     Ccl25    Ccl27a     Ccl28      Ccl5      Ccl7      Cd14 
        1         1         1         1         1         1         1         1         1         1         1         1         1         2         1         1 
cell_type      Cftr     Chil4   Creb3l1    Cx3cl1     Cxcl1    Cxcl10    Cxcl12    Cxcl14    Cxcl15    Cxcl16    Cxcl17     Cxcl2     Ddx58     Defb1     Dhx58 
        1         1         1         1         1         1         1         1         1         1         1         1         1         1         1         1 
    F2rl1     Foxa3     Foxi1     Foxj1     Gata2      Gja1       Gp2     Hpgds     Ifih1      Il10      Il18      Il1b    Il1rl1      Il25      Il33       Il6 
        1         1         1         1         1         1         1         1         1         1         1         1         1         1         1         1 
    Itln1       Lbp      Lcn2    Lgals3       Ltf      Lyz2      Muc1     Muc16      Muc2     Muc20      Muc4    Muc5ac     Muc5b     Myd88     Nlrp6      Nod1 
        1         1         1         1         1         1         1         1         1         1         1         1         1         1         1         1 
     Nod2    Ormdl3       Pf4      Pigr     Ptgds     Ptges     Ptgs2     Reg3g   res.1.4    Retnla    S100a8    S100a9   Scgb1a1 seq_group    Sftpa1     Sftpb 
        1         1         1         1         1         1         1         1         1         1         1         1         1         1         1         1 
    Sftpd      Slpi     Spdef    Sucnr1    Tbxas1      Tff2     Tgfb1     Tgfb2    Ticam1      Tlr2      Tlr4       Tnf      Tslp 
        1         1         1         1         1         1         1         1         1         1         1         1         1 
#for (i in c("Lbp","Cd14","Tlr4","Tlr2","Myd88","Ticam1","Itln1","Reg3g","Lgals3","Nod1","Nod2","Nlrp6","Ddx58","Ifih1","Dhx58","Sucnr1"))
#{
#pdf(file = paste("Manuscript/MicrobialSensing/",i,".pdf", sep = ""), width = 7, height = 3)
#print(ggplot(df_all_wt[(df_all_wt$specific_type %in% #c("Basal","Secretory","Ciliated","Transitional","CiliaSecretory","CyclingEpithelial")),],aes_string(x="age",y=i))+facet_grid(.~specific_type)+geom_dotplot(binaxis="y",aes(fill=age),binwidth=0.#01,stackdir="center",position=position_dodge(0.8), dotsize=0.8)+ stat_summary(aes(color=age),fun.data=mean_sdl, fun.args = list(mult=1), 
#                 geom="pointrange",position=position_dodge(0.7))+ theme(axis.text.x = element_text(angle = 45,hjust=1)))
#dev.off()
#}
Some categories of genes:
lipid synthetic enzymes or inhibitors: “Ormdl3”,“Ptges”,“Ptgds”,“Ptgs2”,“Hpgds”,“Hpgds”,“Ptgr2”,“Tbxas1”,“Alox5”,“Ptgdr”
known Th2 inducers, effectors, and mediators:“Il10”,“Tnf”,“S100a8”,“S100a9”,“Il6”,“Il18”,“Il1b”,“Il1rl1”,“Ccl11”,“Ccl24”,“Il33”,“Il25”,“Tslp”,“F2rl1”,“Retnla”,“Alox15”,“Alox5”,“Gata2”,“Tgfb2”,“Tgfb1”,“Ormdl3”,“Ptges”,“Ptgds”,“Ptgs2”,“Hpgds”,“Tbxas1”,“Areg”
chemokines: Pbpb not expressed, Ccl21c, Ccl21c.1, Cxcl11 not found in mm10.1.2.0. “Cxcl3”,“Cxcl2”,“Cxcl1”,“Pf4”,“Cxcl5”,“Cxcl9”,“Cxcl10”,“Cxcl12”,“Cxcl13”,“Cxcl14”,“Cxcl15”,“Cxcl16”,“Cxcl17”,“Ccl1”,“Ccl2”,“Ccl3”,“Ccl4”,“Ccl5”,“Ccl7”,“Ccl8”,“Ccl11”,“Ccl12”,“Ccl9”,“Ccl17”,“Ccl19”,“Ccl20”,“Ccl21a”,“Ccl21b.1”,“Ccl22”,“Ccl6”,“Ccl24”,“Ccl25”,“Ccl27a”,“Ccl27b”,“Ccl28”,“Xcl1”,“Cx3cl1”
expressed chemokines: “Ccl5”,“Cxcl10”,“Cxcl2”,“Cxcl1”,“Pf4”,“Cxcl12”,“Cxcl14”,“Cxcl15”,“Cxcl16”,“Cxcl17”,“Ccl2”,“Ccl7”,“Ccl17”,“Ccl20”,“Ccl21a”,“Ccl25”,“Ccl27a”,“Ccl28”,“Cx3cl1”
Interleukins (Il3,Il9,Il20,Il31 not expressed):“Il10”,“Il11”,“Il12a”,“Il12b”,“Il13”,“Il15”,“Il16”,“Il17a”,“Il17b”,“Il17c”,“Il17d”,“Il17f”,“Il18”,“Il19”,“Il2”,“Il21”,“Il22”,“Il24”,“Il25”,“Il27”,“Il33”,“Il34”,“Il4”,“Il5”,“Il6”,“Il7”,“Il1a”,“Il1b”
Antimicrobial effectors: “Muc1”,“Muc4”,“Muc16”,“Muc20”,“Muc5b”,“Muc5ac”,“Muc2”,“Defb1”,“Lyz2”,“Ltf”,“Sftpa1”,“Sftpd”,“Sftpb”,“Slpi”,“Lcn2”,“Pigr”,“Chil4”
known epithelial cytokines and mediators: “Il1a”,“Il25”,“Il33”,“Tslp”,“Csf2”,“Ccl5”,“Cxcl10”
Most interferons cannot be found in our dataset:

seurat_E15E16P1P4_wt@meta.data$type_age<-as.factor(paste(seurat_E15E16P1P4_wt@meta.data$cell_type,seurat_E15E16P1P4_wt@meta.data$age,sep="_"))
seurat_E15E16P1P4_wt@meta.data$specificType_age<-as.factor(paste(seurat_E15E16P1P4_wt@meta.data$specific_type,seurat_E15E16P1P4_wt@meta.data$age,sep="_"))
seurat_E15E16P1P4_wt<-SetAllIdent(object = seurat_E15E16P1P4_wt, id = "specific_type")
seurat_E15E16P1P4_wt@ident = factor(seurat_E15E16P1P4_wt@ident,levels(seurat_E15E16P1P4_wt@ident)[c(5,1,19,17,4,3,14,16,20,11,9,10,13,21,12,2,8,6,18,15,7)])
DotPlot(object = seurat_E15E16P1P4_wt, cols.use = c("forestgreen","magenta3"),genes.plot = c("Ccl20","Ptgds","Ptges","Ptgs2","Cxcl15","Cxcl17","Ccl28","Retnla","Nfkbia","Nfkbiz","F2rl1","Areg","Defb1","Sftpd","Sftpb","Sftpa1","Muc1","Muc4","Muc16","Muc20","Muc5b","Muc5ac","Muc2","Lyz2","Ltf","Slpi","Lcn2","Pigr","Chil4","Itln1","Lbp","Lgals3","Reg3g"),group.by = "ident", x.lab.rot = T,plot.legend = T)

print(levels(seurat_E15E16P1P4_wt@ident))
 [1] "Basal_E15"                 "Basal_E16"                 "Basal_P1"                  "Basal_P4"                 
 [5] "Chondrocyte_E15"           "Chondrocyte_E16"           "Chondrocyte_P1"            "Chondrocyte_P4"           
 [9] "CiliaSecretory_E16"        "CiliaSecretory_P1"         "CiliaSecretory_P4"         "Ciliated_E15"             
[13] "Ciliated_E16"              "Ciliated_P1"               "Ciliated_P4"               "CyclingEpithelial_E15"    
[17] "CyclingEpithelial_E16"     "CyclingEpithelial_P1"      "CyclingEpithelial_P4"      "CyclingFibroblast_E15"    
[21] "CyclingFibroblast_E16"     "CyclingFibroblast_P1"      "CyclingFibroblast_P4"      "Doublet_E16"              
[25] "Doublet_P1"                "Fibroblast_E15"            "Fibroblast_E16"            "Fibroblast_P1"            
[29] "Fibroblast_P4"             "Immune_1_E15"              "Immune_1_E16"              "Immune_1_P1"              
[33] "Immune_1_P4"               "Immune_2_E15"              "Immune_2_E16"              "Immune_2_P1"              
[37] "Immune_2_P4"               "LymphaticEndothelial_E15"  "LymphaticEndothelial_E16"  "LymphaticEndothelial_P1"  
[41] "LymphaticEndothelial_P4"   "MesenchymalProgenitor_E15" "MesenchymalProgenitor_E16" "MesenchymalProgenitor_P1" 
[45] "MesenchymalProgenitor_P4"  "Muscle_E15"                "Muscle_E16"                "Muscle_P1"                
[49] "Muscle_P4"                 "Neuron/NEC_E15"            "Neuron/NEC_E16"            "Neuron/NEC_P4"            
[53] "RBC_E16"                   "RBC_P1"                    "RBC_P4"                    "SchwannCell_E15"          
[57] "SchwannCell_E16"           "SchwannCell_P1"            "Secretory_E16"             "Secretory_P1"             
[61] "Secretory_P4"              "Thyroid_E15"               "Thyroid_E16"               "Thyroid_P1"               
[65] "Thyroid_P4"                "Transitional_E15"          "VascularEndothelial_E15"   "VascularEndothelial_E16"  
[69] "VascularEndothelial_P1"    "VascularEndothelial_P4"    "VSMC/pericyte_E15"         "VSMC/pericyte_E16"        
[73] "VSMC/pericyte_P1"          "VSMC/pericyte_P4"         
DotPlot(object = seurat_E15E16P1P4_wt, cols.use = c("gray","forestgreen"),genes.plot = rev(c("Ccl20","Ptgds","Ptges","Ptgs2","Cxcl15","Cxcl17","Ccl28","Retnla","Nfkbia","Nfkbiz","F2rl1","Areg","Defb1","Sftpd","Sftpb","Sftpa1","Muc1","Muc4","Muc16","Muc20","Muc5b","Muc5ac","Muc2","Lyz2","Ltf","Slpi","Lcn2","Pigr","Chil4","Itln1","Lbp","Lgals3","Reg3g")),group.by = "ident", x.lab.rot = T,plot.legend = T,do.return = T)+rotate()+ theme(axis.text.x = element_text(angle = 45, vjust = 1,hjust=1)) #this scales both genotypes together
Factor `id` contains implicit NA, consider using `forcats::fct_explicit_na`

Mucosal chemokines (ccl25, ccl28, cxcl14, and cxcl17):

To look into genes correlated with scGPS scores:
seurat_E15E16P1P4_wt <- RunTSNE(object = seurat_E15E16P1P4_wt, dims.use = 1:n.pcs, seed.use = 10, perplexity=30, dim.embed = 2,k.param=15)
df_Ciliopathy_cor_test<-as.data.frame(do.call(rbind, Ciliopathy_cor_test))
df_order_Ciliopathy_cor_test<-df_Ciliopathy_cor_test[order(unlist(df_Ciliopathy_cor_test$estimate),decreasing = TRUE),]
tidy_Ciliopathy_cor<-cbind(df_order_Ciliopathy_cor_test$estimate,df_order_Ciliopathy_cor_test$p.value)
colnames(tidy_Ciliopathy_cor)<-c("cor","p.value")
tidy_Ciliopathy_cor
              cor        p.value      
Zmynd10       0.546579   0            
Pifo          0.5425509  0            
Lrrc6         0.5384109  0            
Drc1          0.5367434  0            
Dcdc2a        0.4935992  0            
Ccdc65        0.4863407  0            
Ccdc103       0.4782748  0            
Nek5          0.4693503  0            
Pacrg         0.4567388  0            
Traf3ip1      0.4471433  0            
Poc1a         0.4238989  0            
Fgfr1op       0.4206791  0            
Tmem138       0.4191797  0            
Ccdc114       0.4153728  0            
Tctex1d2      0.4115401  0            
Cenpf         0.407906   0            
Cep83         0.4070513  0            
Lrrc56        0.4045086  0            
Ift74         0.400825   0            
Cspp1         0.3996876  0            
Nphp1         0.395385   0            
Cep55         0.3951101  0            
Ift57         0.391189   0            
B9d1          0.3873108  0            
Ift88         0.3869675  0            
Rpgrip1l      0.3865638  0            
Dync2h1       0.3857778  0            
Ift172        0.381393   0            
Ift80         0.3790754  0            
Cep290        0.370438   0            
Plk4          0.368893   0            
Ift81         0.3683296  0            
Wdr34         0.3670231  0            
Arl6          0.3664624  0            
Cep41         0.3654999  0            
B9d2          0.3607634  0            
Ift43         0.3601675  0            
Tmem216       0.3597497  0            
Wdr60         0.3579426  0            
C2cd3         0.3569508  0            
Dync2li1      0.3564985  0            
Bbs5          0.3533716  0            
Wdr35         0.349725   0            
Tmem67        0.3472159  0            
Spag1         0.3449336  0            
Nek1          0.343219   0            
Tmem107       0.342606   0            
Wdpcp         0.3425418  0            
Sclt1         0.3367607  0            
Ift52         0.3292574  0            
Wdr19         0.3243224  0            
Kif11         0.3242046  0            
Cc2d2a        0.3237188  0            
2700049A03Rik 0.3222697  0            
Tmem231       0.320627   0            
Tmem17        0.3174036  0            
Cep164        0.3159639  0            
D430042O09Rik 0.3156484  0            
Bbip1         0.3148218  0            
2610301B20Rik 0.3137307  0            
Mks1          0.3134762  0            
Ift140        0.3058836  0            
Armc9         0.3034685  0            
Cep104        0.3006778  0            
1810043G02Rik 0.3004568  0            
Cep120        0.2943722  0            
Pibf1         0.2876425  1.388627e-317
Bbs7          0.2867671  1.392889e-315
Sdccag8       0.2848902  2.576083e-311
Ift122        0.2829121  7.454808e-307
Ift27         0.2670399  2.307436e-272
Bbs2          0.263533   4.716935e-265
Lztfl1        0.2576021  6.101379e-253
Ofd1          0.2527573  2.793616e-243
Intu          0.2493308  1.423027e-236
Inpp5e        0.2490544  4.894807e-236
Bbs1          0.2472615  1.424276e-232
Mre11a        0.2471985  1.882916e-232
Tbc1d32       0.2461905  1.618676e-230
Arl3          0.2422522  4.807888e-223
Poc1b         0.2354816  1.634973e-210
Mapkbp1       0.2330952  3.435638e-206
Fuz           0.2324085  5.899545e-205
Tctn3         0.223917   5.0765e-190  
Kif14         0.2098085  1.478587e-166
Pde6d         0.2009281  1.221831e-152
Notch1        0.1970841  8.116042e-147
Tctn1         0.1954091  2.56165e-144 
Mkks          0.1951724  5.752278e-144
Kctd10        0.1907798  1.571154e-137
Nphp3         0.1855321  4.787185e-130
Ccdc28b       0.1776045  3.662696e-119
Nek8          0.1751189  7.45169e-116 
Ttc21b        0.1615266  1.24399e-98  
Pik3r4        0.1607992  9.445133e-98 
Bbs12         0.1567567  6.200812e-93 
Sall1         0.1512815  1.296525e-86 
Gna12         0.1460858  7.835921e-81 
Galnt11       0.1320623  2.849657e-66 
Gli3          0.1303523  1.338961e-64 
Ahi1          0.1281622  1.719821e-62 
Tubgcp6       0.1242371  8.376372e-59 
Bbs10         0.1201034  4.783023e-55 
Sirt2         0.1090072  1.328542e-45 
Qk            0.1084995  3.413186e-45 
Wwtr1         0.1078645  1.104313e-44 
Fan1          0.09629114 6.398198e-36 
Sufu          0.08002379 2.726486e-25 
Kif7          0.07953328 5.317248e-25 
Glis2         0.0764992  3.024284e-23 
Zfp423        0.03725636 1.354483e-06 
Gucy2e        0.03294734 1.933375e-05 
unlist(tidy_Ciliopathy_cor[,1])
      Zmynd10.cor          Pifo.cor         Lrrc6.cor          Drc1.cor        Dcdc2a.cor        Ccdc65.cor 
       0.54657904        0.54255092        0.53841095        0.53674336        0.49359917        0.48634066 
      Ccdc103.cor          Nek5.cor         Pacrg.cor      Traf3ip1.cor         Poc1a.cor       Fgfr1op.cor 
       0.47827477        0.46935028        0.45673881        0.44714331        0.42389891        0.42067915 
      Tmem138.cor       Ccdc114.cor      Tctex1d2.cor         Cenpf.cor         Cep83.cor        Lrrc56.cor 
       0.41917967        0.41537280        0.41154005        0.40790602        0.40705129        0.40450856 
        Ift74.cor         Cspp1.cor         Nphp1.cor         Cep55.cor         Ift57.cor          B9d1.cor 
       0.40082497        0.39968759        0.39538503        0.39511007        0.39118900        0.38731078 
        Ift88.cor      Rpgrip1l.cor       Dync2h1.cor        Ift172.cor         Ift80.cor        Cep290.cor 
       0.38696745        0.38656376        0.38577781        0.38139299        0.37907543        0.37043802 
         Plk4.cor         Ift81.cor         Wdr34.cor          Arl6.cor         Cep41.cor          B9d2.cor 
       0.36889297        0.36832959        0.36702306        0.36646235        0.36549993        0.36076339 
        Ift43.cor       Tmem216.cor         Wdr60.cor         C2cd3.cor      Dync2li1.cor          Bbs5.cor 
       0.36016751        0.35974972        0.35794263        0.35695076        0.35649847        0.35337160 
        Wdr35.cor        Tmem67.cor         Spag1.cor          Nek1.cor       Tmem107.cor         Wdpcp.cor 
       0.34972497        0.34721589        0.34493360        0.34321905        0.34260603        0.34254181 
        Sclt1.cor         Ift52.cor         Wdr19.cor         Kif11.cor        Cc2d2a.cor 2700049A03Rik.cor 
       0.33676072        0.32925738        0.32432245        0.32420459        0.32371885        0.32226969 
      Tmem231.cor        Tmem17.cor        Cep164.cor D430042O09Rik.cor         Bbip1.cor 2610301B20Rik.cor 
       0.32062701        0.31740361        0.31596392        0.31564838        0.31482181        0.31373074 
         Mks1.cor        Ift140.cor         Armc9.cor        Cep104.cor 1810043G02Rik.cor        Cep120.cor 
       0.31347622        0.30588356        0.30346851        0.30067775        0.30045684        0.29437219 
        Pibf1.cor          Bbs7.cor       Sdccag8.cor        Ift122.cor         Ift27.cor          Bbs2.cor 
       0.28764247        0.28676713        0.28489023        0.28291214        0.26703987        0.26353297 
       Lztfl1.cor          Ofd1.cor          Intu.cor        Inpp5e.cor          Bbs1.cor        Mre11a.cor 
       0.25760209        0.25275731        0.24933081        0.24905441        0.24726149        0.24719847 
      Tbc1d32.cor          Arl3.cor         Poc1b.cor       Mapkbp1.cor           Fuz.cor         Tctn3.cor 
       0.24619054        0.24225224        0.23548163        0.23309521        0.23240846        0.22391701 
        Kif14.cor         Pde6d.cor        Notch1.cor         Tctn1.cor          Mkks.cor        Kctd10.cor 
       0.20980850        0.20092807        0.19708409        0.19540907        0.19517236        0.19077984 
        Nphp3.cor       Ccdc28b.cor          Nek8.cor        Ttc21b.cor        Pik3r4.cor         Bbs12.cor 
       0.18553207        0.17760446        0.17511892        0.16152657        0.16079922        0.15675672 
        Sall1.cor         Gna12.cor       Galnt11.cor          Gli3.cor          Ahi1.cor       Tubgcp6.cor 
       0.15128147        0.14608581        0.13206233        0.13035234        0.12816225        0.12423714 
        Bbs10.cor         Sirt2.cor            Qk.cor         Wwtr1.cor          Fan1.cor          Sufu.cor 
       0.12010344        0.10900717        0.10849955        0.10786448        0.09629114        0.08002379 
         Kif7.cor         Glis2.cor        Zfp423.cor        Gucy2e.cor 
       0.07953328        0.07649920        0.03725636        0.03294734 

#volc_Ciliopathy_cor<-mutate(tidy_Ciliopathy_cor,sig=ifelse(tidy_Ciliopathy_cor$p.value<0.01,"P_adj<0.01","Not Sig"))
df_tidy_ciliopathy_cor<-data.frame(matrix(unlist(tidy_Ciliopathy_cor), nrow=112, byrow=F),stringsAsFactors=FALSE)
colnames(df_tidy_ciliopathy_cor)<-c("cor","p.value")
df_tidy_ciliopathy_cor$gene<-rownames(tidy_Ciliopathy_cor)

unlist(x)[2:30]
    Cenpf     Cep55     Kif11   Tmem138      Plk4   Fgfr1op  Dync2li1     Ift57     Ift52     Nphp1     Ift74      Arl6  Tctex1d2 
0.9290814 0.9066218 0.8907960 0.8105366 0.8061935 0.8028617 0.7735900 0.7513981 0.7497918 0.7491373 0.7369705 0.7260828 0.7077285 
    Cspp1      Mkks    Cep164     Bbip1      B9d1     Pde6d     Ift43      Arl3    Kctd10   Tmem107     Sirt2        Qk    Lztfl1 
0.6831866 0.6693836 0.6540933 0.6537958 0.6483817 0.6434139 0.6353225 0.6175333 0.6173846 0.5910281 0.5530700 0.5435209 0.5248394 
    Armc9  Traf3ip1     Kif14 
0.0000000 0.0000000 0.0000000 
wt_mucosa_cluster<-data.frame(percentile_table_E15E16P1P4wt[,colnames(percentile_table_E15E16P1P4wt) %in% geneList$Mucosa.epithelium.goblet],seurat_E15E16P1P4_wt@meta.data$res.1.4)
aggre_wt_mucosa_cluster<-aggregate(wt_mucosa_cluster[, 1:301], list(wt_mucosa_cluster[,302]), median)
unlist(sort(aggre_wt_mucosa_cluster[aggre_wt_mucosa_cluster$Group.1==8,],decreasing = TRUE))[2:51]
    Aurka     Epcam     Bub1b     Ap1m2      Cdh2     Krt17     Lamb3     Erbb2     Fgfr3     Trp53      Dkc1 
0.9465433 0.9464838 0.9262256 0.8715195 0.8370419 0.8083948 0.7931045 0.7698715 0.7693658 0.7673429 0.7644277 
      Dsp    Ctnnb1      Cdh1    Tmem97    Mapk14     Rab25      Sdc1     Fgfr2      Rela  Cdc42ep4      Nras 
0.7623156 0.7584781 0.7551761 0.7547596 0.7376547 0.7327166 0.7238517 0.7090374 0.7087994 0.6999048 0.6965136 
   Pycard      Med1   Zkscan3      Rnf6      Ece1      Yap1      Odc1      Klf6     Mark2     Smad7    Slc6a6 
0.6929438 0.6918729 0.6917539 0.6882437 0.6864291 0.6695621 0.6653974 0.6621549 0.6598644 0.6582580 0.6565326 
      Bax     Smad4     Stk11     Sar1b   Dnajc10      Pdpn    Nfkbiz     Bcl10   Ndufa13      Rps3     Mfge8 
0.6538256 0.6511483 0.6306521 0.6227094 0.5781473 0.5703832 0.5436994 0.5382853 0.5209127 0.5033615 0.5031830 
     Igf2      Akt1      Gnas    Nfkbia   Scgb3a2     Il17a 
0.4425274 0.4134043 0.4093586 0.4013267 0.3237149 0.0000000 
LS0tCnRpdGxlOiAiVHJhY2hlYV9XVF8xMHgiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KIyMgVGhpcyBzY3JpcHQgYW5hbHl6ZSAxMHggc2NSTkEtc2VxIGRhdGEgZnJvbSBFMTUsIEUxNiwgUDEsIGFuZCBQNCB3dCBtaWNlCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KE1hdHJpeCkKcmVxdWlyZShkZXZ0b29scykKaW5zdGFsbF92ZXJzaW9uKCJtdnRub3JtIiwgdmVyc2lvbiA9ICIxLjAtOCIsIHJlcG9zID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciKSAjI05vdGUgdGhhdCBJIG5lZWQgdmVyc2lvbiAxLjAtOCBiZWNhdXNlIHRoZSBuZXdlc3QgdmVyc2lvbiByZXF1aXJlcyBSPjMuNSAobXkgciB2ZXJzaW9uIGlzIDMuNCkuIG12dG5vcm0gaXMgYSBkZXBlbmRlbmN5IGZvciBmcGMgd2hpY2ggaXMgYSBkZXBlbmRlbmN5IGZvciBTZXVyYXQuCmxpYnJhcnkoU2V1cmF0KQpgYGAKCiMjIyMjIEZpcnN0IGxvYWQgRTE1IGRhdGEgKG5HZW5lIDFrLCBuVU1JIDVrIGFscmVhZHkgYXBwbGllZCkKYGBge3J9CmxvYWQoIkUxNV9PY3QxMF8xMFhfVHJhY2hlYS5SRGF0YSIpCkUxNV9PY3QxMF9tbTEwLjEuMi4wX1RyYWNoZWEgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gRTE1X09jdDEwX21tMTAuMS4yLjBfVHJhY2hlYSwgaWQgPSAiZ2Vub3R5cGUiKQoKYGBgCiMjIyMjIHNlY29uZCBsb2FkIHNldV9FMTZQMVA0X3d0LlJEYXRhCmBgYHtyfQpsb2FkKCJzZXVfRTE2UDFQNF93dC5SRGF0YSIpCgpgYGAKIyMjIyMgZGF0YSBoYXMgYmVlbiBsb2cgbm9ybWFsaXplZC4KYGBge3J9CnNldXJhdF9FMTVFMTZQMVA0X3d0PC1NZXJnZVNldXJhdChvYmplY3QxID0gc2V1X0UxNlAxUDRfd3Qsb2JqZWN0MiA9IFN1YnNldERhdGEob2JqZWN0PUUxNV9PY3QxMF9tbTEwLjEuMi4wX1RyYWNoZWEsaWRlbnQudXNlPWMoInd0IikpLG1pbi5jZWxscyA9IDEsbWluLmdlbmVzID0gMSxwcm9qZWN0PSJFMTVPY3QxMF9FMTZEZWM3X1AxRGVjMTFfUDRPY3QxOCIpCmBgYAojIyMjIyByZW1vdmUgb2xkIGFuYWx5c2lzIGRvbmUgb24gdGhlIEUxNlAxUDQgZGF0YXNldDoKYGBge3J9CnNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YTwtc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhWywtd2hpY2gobmFtZXMoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhKSAlaW4lIGMoInJlcy4wLjgiLCAicmVzLjEuMiIsInJlcy4xLjQiLCJjZWxsX3R5cGUiLCJTLlNjb3JlIiwiRzJNLlNjb3JlIiwiUGhhc2UiLCJvbGQuaWRlbnQiLCJDZWxsQ3ljbGVfc2NvcmUiLCJtb2Nvc2FHb2JsZXRfc2NvcmUiLCJjaWxpb3BhdGh5X3Njb3JlIiwiUENEX3Njb3JlIikpXQpgYGAKIyMjIyMgQmFzaWMgc3RhdHMgYWJvdXQgdGhlIGRhdGE6CmBgYHtyfQphZ2dyZWdhdGUoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhWywgYygxOjIsODo5KV0sIGxpc3Qoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHNlcV9ncm91cCksIG1lZGlhbikKCmBgYApgYGB7cn0KbWVkaWFuKHNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRuR2VuZSkgCmBgYApgYGB7cn0KbWVhbihzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkbkdlbmUpIApgYGAKYGBge3J9Cm1lZGlhbihzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkblVNSSkgCmBgYApgYGB7cn0KbWVhbihzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkblVNSSkgCmBgYApgYGB7cn0KdGFibGUoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJGFnZSkgCmBgYApgYGB7cn0KdGFibGUoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHNlcV9ncm91cCkgCmBgYAoKIyMjIyMgc2NhbGUgdGhlIGRhdGE6CmBgYHtyfQpzZXVyYXRfRTE1RTE2UDFQNF93dCA8LSBTY2FsZURhdGEob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QpCmBgYAoKIyMjIyMgZmluZCB2YXJpYWJsZSBnZW5lcyBhbmQgcnVuIFBDQToKYGBge3J9CnNldXJhdF9FMTVFMTZQMVA0X3d0IDwtIEZpbmRWYXJpYWJsZUdlbmVzKG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBkby5wbG90ID0gVFJVRSwgeC5sb3cuY3V0b2ZmPTAuMSx4LmhpZ2guY3V0b2ZmID0gSW5mLCB5LmN1dG9mZiA9IDAuNSkKYGBgCmBgYHtyfQpzZXVyYXRfRTE1RTE2UDFQNF93dCA8LSBSdW5QQ0Eob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QscGNzLmNvbXB1dGUgPSAyNSwgZG8ucHJpbnQgPSBGQUxTRSkKc2V1cmF0X0UxNUUxNlAxUDRfd3QgPC0gUHJvamVjdFBDQShvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZG8ucHJpbnQgPSBGQUxTRSkKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9MjAsZmlnLndpZHRoPTh9ClBDSGVhdG1hcChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgcGMudXNlID0gYygxOjEyKSwgY2VsbHMudXNlID0gNTAwLCBkby5iYWxhbmNlZCA9IFRSVUUsIGxhYmVsLmNvbHVtbnMgPSBGQUxTRSwgbnVtLmdlbmVzID0gMzApCgpgYGAKCmBgYHtyfQpQQ0VsYm93UGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCxudW0ucGMgPSAyNSkKYGBgCiMjIyMjIGNsdXN0ZXJpbmc6CiMjIyMjIHRyeSByZXNvbHV0aW9uPTAuODoKYGBge3J9Cm4ucGNzID0gMjQKcmVzLnVzZWQgPC0gMC44CgpzZXVyYXRfRTE1RTE2UDFQNF93dCA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIHJlZHVjdGlvbi50eXBlID0gInBjYSIsIGRpbXMudXNlID0gMTpuLnBjcywgCiAgICByZXNvbHV0aW9uID0gcmVzLnVzZWQsIHByaW50Lm91dHB1dCA9IDAsIHNhdmUuU05OID0gVFJVRSkKYGBgCmBgYHtyfQpzZXVyYXRfRTE1RTE2UDFQNF93dCA8LSBSdW5UU05FKG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBkaW1zLnVzZSA9IDE6bi5wY3MsIHNlZWQudXNlID0gMTAsIHBlcnBsZXhpdHk9MzAsIGRpbS5lbWJlZCA9IDIpCgpgYGAKCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZG8ubGFiZWwgPSBULHB0LnNpemUgPSAwLjIsZ3JvdXAuYnk9InJlcy4wLjgiKQoKYGBgCgojIyMjIyByZXNvbHV0aW9uPTEuNDoKYGBge3J9Cm4ucGNzID0gMjQKcmVzLnVzZWQgPC0gMS40CgpzZXVyYXRfRTE1RTE2UDFQNF93dCA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIHJlZHVjdGlvbi50eXBlID0gInBjYSIsIGRpbXMudXNlID0gMTpuLnBjcywgCiAgICByZXNvbHV0aW9uID0gcmVzLnVzZWQsIHByaW50Lm91dHB1dCA9IDAsIHNhdmUuU05OID0gVFJVRSkKYGBgCgojIyMjIyBrLnBhcmFtPTE1IHRvIGhhdmUgYmV0dGVyIGRpc3RpbmN0aW9uIGZvciByYXJlIGNlbGxzOgpgYGB7cn0Kc2V1cmF0X0UxNUUxNlAxUDRfd3QgPC0gUnVuVFNORShvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZGltcy51c2UgPSAxOm4ucGNzLCBzZWVkLnVzZSA9IDEwLCBwZXJwbGV4aXR5PTMwLCBkaW0uZW1iZWQgPSAyLGsucGFyYW09MTUpCgpgYGAKCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZG8ubGFiZWwgPSBULHB0LnNpemUgPSAwLjIsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCgoKIyMjIyMjIHJlczEuNiBsZWFkcyB0byBmdXJ0aGVyIHNwZWNpZmljYXRpb24gb2YgaW1tdW5lIGNlbGxzLCBQMSBhbmQgUDQgbWVzZW5jaHltYWwgcHJvZ2VuaXRvciBzZXBhcmF0aW9uLCBhbmQgc2VwYXJhdGlvbiBvZiBFMTYgYmFzYWw6CmBgYHtyfQpuLnBjcyA9IDI0CnJlcy51c2VkIDwtIDEuNgoKc2V1cmF0X0UxNUUxNlAxUDRfd3QgPC0gRmluZENsdXN0ZXJzKG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3MsIAogICAgcmVzb2x1dGlvbiA9IHJlcy51c2VkLCBwcmludC5vdXRwdXQgPSAwLCBzYXZlLlNOTiA9IFRSVUUpCmBgYApgYGB7cn0Kc2V1cmF0X0UxNUUxNlAxUDRfd3QgPC0gUnVuVFNORShvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZGltcy51c2UgPSAxOm4ucGNzLCBzZWVkLnVzZSA9IDEwLCBwZXJwbGV4aXR5PTMwLCBkaW0uZW1iZWQgPSAyLGsucGFyYW09MTUpCgpgYGAKCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZG8ubGFiZWwgPSBULHB0LnNpemUgPSAwLjIsZ3JvdXAuYnk9InJlcy4xLjYiKQpgYGAKCiMjIyMjIFdlIHdpbGwgdXNlIHJlc29sdXRpb24gb2YgMS40IGZvciBmdXJ0aGVyIGFuYWx5c2lzLgoKIyMjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQojc2F2ZShzZXVyYXRfRTE1RTE2UDFQNF93dCxmaWxlPSJzZXVyYXRFMTVFMTZQMVA0X3d0LlJEYXRhIikgICMgdGhpcyBzZXVyYXQgb2JqZWN0IHdpbGwgYmUgdXBkYXRlZCBhbmQgc2F2ZWQgYXMgYW5hbHlzaXMgZ29lcwpgYGAKCmBgYHtyfQojbG9hZCgic2V1cmF0RTE1RTE2UDFQNF93dC5SRGF0YSIpCmBgYAoKCmBgYHtyLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTV9CgpUU05FUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZG8ubGFiZWwgPSBGLHB0LnNpemUgPSAwLjIsZ3JvdXAuYnk9ImFnZSIpCgpgYGAKIyMjIyMgMiBFMTYgd3QgbWljZToKYGBge3IsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NX0KVFNORVBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGRvLmxhYmVsID0gRixncm91cC5ieT0ic2VxX2dyb3VwIixwdC5zaXplID0gMC4yLGNlbGxzLnVzZSA9IHNldXJhdF9FMTVFMTZQMVA0X3d0QGNlbGwubmFtZXNbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJGFnZT09IkUxNiJdKQoKYGBgCgojIyMjIyAyIFAxIHd0IG1pY2U6CmBgYHtyLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTV9ClRTTkVQbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBkby5sYWJlbCA9IEYsZ3JvdXAuYnk9InNlcV9ncm91cCIscHQuc2l6ZSA9IDAuMixjZWxscy51c2UgPSBzZXVyYXRfRTE1RTE2UDFQNF93dEBjZWxsLm5hbWVzW3NldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRhZ2U9PSJQMSJdKQoKYGBgCgoKIyMjIyMgQW5ub3RhdGUgY2x1c3RlcnMgYnkga25vd24gbWFya2VyczoKCmBgYHtyLGZpZy5oZWlnaHQ9MTcsZmlnLndpZHRoPTUwfQpzZXVyYXRfRTE1RTE2UDFQNF93dCA8LSBTZXRBbGxJZGVudChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgaWQgPSAicmVzLjEuNCIpCgpEb0hlYXRtYXAob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiVHJwNjMiLCJLcnQ0IiwiU2NnYjNhMiIsIlNwZGVmIiwiQ3JlYjNsMSIsIk11YzViIiwiR3AyIiwiRm94ajEiLCJTbmFwMjUiLCJDaGdhIiwiUGxwMSIsIk1weiIsIkZjZXIxZyIsIlBlY2FtMSIsIkFjdGEyIiwiTXloMTEiLCJDb2wxMWExIiwiQWNhbiIsIldudDIiLCJQaTE2IiwiTHk2YSIsIlR3aXN0MiIsIk1raTY3IiwiVG9wMmEiLCJUZyIsIlBheDgiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQsZ3JvdXAuYnk9InJlcy4xLjQiLGdyb3VwLmNleCA9IDI1LGNleC5yb3c9MzAsZ3JvdXAub3JkZXIgPSBjKDMsOCwxMSw5LDEsMzAsMiwyMCwyOSw3LDI2LDI3LDI4LDE0LDMxLDIzLDE4LDIxLDEzLDE1LDE5LDE2LDEwLDEyLDYsNCwxNywwLDUsMzMsMjIsMjUsMjQsMzIpCiAgKQpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9MTcsZmlnLndpZHRoPTUwfQpzZXVyYXRfRTE1RTE2UDFQNF93dCA8LSBTZXRBbGxJZGVudChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgaWQgPSAicmVzLjEuNCIpCgpEb0hlYXRtYXAob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGNlbGxzLnVzZSA9IHNldXJhdF9FMTVFMTZQMVA0X3d0QGNlbGwubmFtZXNbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDMsOCwxMSw5LDEsMzAsMiwyMCwyOSw3LDI2LDI3LDI4KV0sZ2VuZXMudXNlID0gYygiRXBjYW0iLCJUcnA2MyIsIktydDQiLCJTY2diM2EyIiwiU3BkZWYiLCJDcmViM2wxIiwiTXVjNWIiLCJHcDIiLCJGb3hqMSIsIlNuYXAyNSIsIkNoZ2EiLCJQbHAxIiwiTXB6IiwiRmNlcjFnIiwiUGVjYW0xIiwiQWN0YTIiLCJNeWgxMSIsIkNvbDExYTEiLCJBY2FuIiwiV250MiIsIlBpMTYiLCJMeTZhIiwiVHdpc3QyIiwiTWtpNjciLCJUb3AyYSIsIlRnIiwiUGF4OCIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0icmVzLjEuNCIsZ3JvdXAuY2V4ID0gMjUsY2V4LnJvdz0zNSxncm91cC5vcmRlciA9IGMoMyw4LDExLDksMSwzMCwyLDIwLDI5LDcsMjYsMjcsMjgpCiAgKQpgYGAKYGBge3IsZmlnLmhlaWdodD01LGZpZy53aWR0aD0yNX0KVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZmVhdHVyZXMucGxvdCA9IGMoImRvdWJsZXRfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTE1fQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBmZWF0dXJlcy5wbG90ID0gYygiZG91YmxldF9zY29yZSIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0ic3BlY2lmaWNfdHlwZSIpCgpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQpGZWF0dXJlUGxvdChzZXVyYXRfRTE1RTE2UDFQNF93dCwgYygiQWxhczIiLCJIYmEtYTIiKSxwdC5zaXplID0gMC4zLCBvdmVybGF5PVRSVUUsbm8ubGVnZW5kPUZBTFNFLGNvbHMudXNlPWMoImdyZXkiLCJyZWQiLCJibHVlIiwiZ3JlZW4iKSxtYXguY3V0b2ZmID0gYygyLjUsNSkpCmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMn0KRmVhdHVyZVBsb3Qoc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGMoIlRnIiwiUGF4OCIpLHB0LnNpemUgPSAwLjIsbm8ubGVnZW5kPUZBTFNFLG5Db2wgPSAyKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQpGZWF0dXJlUGxvdChzZXVyYXRfRTE1RTE2UDFQNF93dCwgYygiVGciLCJQYXg4IikscHQuc2l6ZSA9IDAuMywgb3ZlcmxheT1UUlVFLG5vLmxlZ2VuZD1GQUxTRSxjb2xzLnVzZT1jKCJncmV5IiwicmVkIiwiYmx1ZSIsImdyZWVuIiksbWF4LmN1dG9mZiA9IGMoMi41LDEpKQpgYGAKCiMjIyMjIGNsdXN0ZXIgYW5ub3RhdGlvbiB2MToKYGBge3J9CmxpYnJhcnkocGx5cikKc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJGNlbGxfdHlwZTwtbWFwdmFsdWVzKHNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRyZXMuMS40LGZyb209YygiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIzMCIsIjMxIiwiMzIiLCIzMyIpLHRvPWMoIkZpYnJvYmxhc3QiLCJCYXNhbCIsIlNlY3JldG9yeSIsIkJhc2FsIiwiRmlicm9ibGFzdCIsIkZpYnJvYmxhc3QiLCJGaWJyb2JsYXN0IiwiU2VjcmV0b3J5IiwiQ3ljbGluZ0VwaXRoZWxpYWwiLCJUcmFuc2l0aW9uYWwiLCJGaWJyb2JsYXN0IiwiQ3ljbGluZ0VwaXRoZWxpYWwiLCJGaWJyb2JsYXN0IiwiRmlicm9ibGFzdCIsIkltbXVuZSIsIkZpYnJvYmxhc3QiLCJGaWJyb2JsYXN0IiwiRmlicm9ibGFzdCIsIk11c2NsZSIsIkZpYnJvYmxhc3QiLCJDaWxpYXRlZCIsIk11c2NsZSIsIk1lc2VuY2h5bWFsUHJvZ2VuaXRvciIsIkVuZG90aGVsaWFsIiwiVGh5cm9pZCIsIk1lc2VuY2h5bWFsUHJvZ2VuaXRvciIsIk5ldXJhbC9TY2h3YW5uIiwiQ2lsaWF0ZWQiLCJDaWxpYVNlY3JldG9yeSIsIkJhc2FsIiwiQ3ljbGluZ0VwaXRoZWxpYWwiLCJFbmRvdGhlbGlhbCIsIkRvdWJsZXQiLCJNZXNlbmNoeW1hbFByb2dlbml0b3IiKSkKYGBgCgojIyMjIyB1c2Ugbm9uU2hoIHN1YnNldCBjbHVzdGVyaW5nIGluZm9ybWF0aW9uIChzZXVyYXQgb2JqZWN0OiBFMTVFMTZQMVA0X3d0X25vblNoaCByZXNvbHV0aW9uPTEuNikgdG8gYW5ub3RhdGUgdGhvc2Ugbm9uLWVwaXRoZWxpYWwgY2VsbHM6CmBgYHtyfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtQWRkTWV0YURhdGEob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIG1ldGFkYXRhID0gd3Rfbm9uU2hoX2NlbGxUeXBlMS42LCBjb2wubmFtZSA9ICJzcGVjaWZpY190eXBlIikKYGBgCmBgYHtyfQp0YWJsZShzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkc3BlY2lmaWNfdHlwZSkKYGBgCgojIyMjIyBrZWVwIHRoZSBlcGl0aGVsaWFsIGNlbGwgYW5ub3RhdGlvbiBhcyBpbiBzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkY2VsbF90eXBlOgpgYGB7cn0Kc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGUgPC0gaWZlbHNlKGlzLm5hKHNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRzcGVjaWZpY190eXBlKSwgYXMuY2hhcmFjdGVyKHNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRjZWxsX3R5cGUpLCBhcy5jaGFyYWN0ZXIoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGUpKQpgYGAKCiMjIyMjIG5vdyB3ZSBoYXZlIG5ldyAobW9yZSBkZXRhaWxlZCkgYW5ub3RhdGlvbiBmb3IgYWxsIGNlbGxzOgpgYGB7cn0KdGFibGUoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGUpCmBgYAoKYGBge3J9CnRhYmxlKHNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRzcGVjaWZpY190eXBlLHNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRnYXRlLHVzZU5BID0gImFsd2F5cyIpICAKI2dhdGUgPE5BPiBtZWFucyBjZWxscyBmcm9tIEUxNiBhbmQgUDEgd2hpY2ggZGlkIG5vdCBnbyB0aHJvdWdoIEZBQ1MKYGBgCiMjIyMjIHNwZWNpZmljX3R5cGUgb2YgZWFjaCBjZWxsIGlzIGRlZmluZWQgbGF0ZXIuCmBgYHtyLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTV9CgpUU05FUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZG8ubGFiZWwgPSBGLHB0LnNpemUgPSAwLjIsZ3JvdXAuYnk9InNwZWNpZmljX3R5cGUiKStzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJyNlNjE5NGInLCAnIzNjYjQ0YicsICcjZmZlMTE5JywgJyM0MzYzZDgnLCAnI2Y1ODIzMScsICcjOTExZWI0JywgJyM0NmYwZjAnLCAnI2YwMzJlNicsICcjYmNmNjBjJywgJyNmYWJlYmUnLCAnIzAwODA4MCcsICcjZTZiZWZmJywgJyM5YTYzMjQnLCAnIzAwMDAwMCcsICcjZmZmYWM4JywgJyM4MDAwMDAnLCAnI2FhZmZjMycsICcjODA4MDAwJywgJyNmZmQ4YjEnLCAnIzAwMDA3NScsICcjODA4MDgwJywgJyNmZmZmZmYnCikpCgpgYGAKYGBge3IsZmlnLndpZHRoPTUsZmlnLmhlaWdodD01fQpnZ3Bsb3QoZGF0YT1zZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGFbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJGFnZSAlaW4lIGMoIkUxNSIpLF0sYWVzKGdhdGUsZmlsbD1zcGVjaWZpY190eXBlKSkrIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkrc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoJyNlNjE5NGInLCAnIzNjYjQ0YicsICcjNDM2M2Q4JywgJyNmNTgyMzEnLCAnIzkxMWViNCcsICcjZjAzMmU2JywgJyNiY2Y2MGMnLCAnI2ZhYmViZScsICcjMDA4MDgwJywgJyNlNmJlZmYnLCAnIzlhNjMyNCcsICcjMDAwMDAwJywgJyM4MDAwMDAnLCAnIzgwODAwMCcsICcjZmZkOGIxJywgJyMwMDAwNzUnLCAnIzgwODA4MCcsICcjZmZmZmZmJwopKSAgCmBgYAoKCmBgYHtyLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NX0KZ2dwbG90KGRhdGE9c2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhW3NldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRhZ2UgJWluJSBjKCJQNCIpLF0sYWVzKGdhdGUsZmlsbD1zcGVjaWZpY190eXBlKSkrIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkrc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoJyNlNjE5NGInLCAnIzNjYjQ0YicsICcjZmZlMTE5JywgJyM0MzYzZDgnLCAnI2Y1ODIzMScsICcjOTExZWI0JywgJyNmMDMyZTYnLCAnI2JjZjYwYycsICcjZmFiZWJlJywgJyMwMDgwODAnLCAnI2U2YmVmZicsICcjOWE2MzI0JywgJyMwMDAwMDAnLCAnI2ZmZmFjOCcsICcjYWFmZmMzJywgJyM4MDgwMDAnLCAnIzAwMDA3NScsICcjODA4MDgwJywgJyNmZmZmZmYnCikpCmBgYApgYGB7cixmaWcud2lkdGg9MTAsZmlnLmhlaWdodD01fQpnZ3Bsb3QoZGF0YT1zZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEsYWVzKHNwZWNpZmljX3R5cGUsZmlsbD1hZ2UpKSsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpgYGAKCgoKYGBge3IsZmlnLndpZHRoPTUsZmlnLmhlaWdodD04fQpnZ3Bsb3QoZGF0YT1zZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGFbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJGFnZSAlaW4lIGMoIlAxIiksXSxhZXMoc2VxX2dyb3VwLGZpbGw9c3BlY2lmaWNfdHlwZSkpKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpK3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCcjZTYxOTRiJywgJyMzY2I0NGInLCAnI2ZmZTExOScsICcjNDM2M2Q4JywgJyNmNTgyMzEnLCAnIzkxMWViNCcsICcjNDZmMGYwJywgJyNmMDMyZTYnLCAnI2JjZjYwYycsICcjZmFiZWJlJywgJyMwMDgwODAnLCAnI2U2YmVmZicsICcjOWE2MzI0JywgJyNmZmZhYzgnLCAnIzgwMDAwMCcsICcjYWFmZmMzJywgJyM4MDgwMDAnLCAnIzAwMDA3NScsICcjODA4MDgwJywgJyNmZmZmZmYnCikpCmBgYApgYGB7cixmaWcud2lkdGg9NSxmaWcuaGVpZ2h0PTh9CmdncGxvdChkYXRhPXNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YVtzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkYWdlICVpbiUgYygiRTE2IiksXSxhZXMoc2VxX2dyb3VwLGZpbGw9c3BlY2lmaWNfdHlwZSkpKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpK3NjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCcjZTYxOTRiJywgJyMzY2I0NGInLCAnI2ZmZTExOScsICcjNDM2M2Q4JywgJyNmNTgyMzEnLCAnIzkxMWViNCcsICcjNDZmMGYwJywgJyNmMDMyZTYnLCAnI2JjZjYwYycsICcjZmFiZWJlJywgJyMwMDgwODAnLCAnI2U2YmVmZicsICcjOWE2MzI0JywnIzAwMDAwMCcsICcjZmZmYWM4JywgJyM4MDAwMDAnLCAnI2FhZmZjMycsICcjODA4MDAwJywgJyMwMDAwNzUnLCAnIzgwODA4MCcsICcjZmZmZmZmJwopKQpgYGAKCgpgYGB7cn0Kc2F2ZShzZXVyYXRfRTE1RTE2UDFQNF93dCxmaWxlPSJzZXVyYXRFMTVFMTZQMVA0X3d0LlJEYXRhIikKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTE3LGZpZy53aWR0aD05MH0KRG9IZWF0bWFwKG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBnZW5lcy51c2UgPSBjKCJFcGNhbSIsIlRycDYzIiwiS3J0NSIsIktydDgiLCJTY2diM2EyIiwiU3BkZWYiLCJDcmViM2wxIiwiR3AyIiwiRm94ajEiLCJUd2lzdDIiLCJXbnQyIiwiTHk2YSIsIlRoeTEiLCJTb3g5IiwiQWNhbiIsIkFjdGEyIiwiTXloMTEiLCJSZ3M1IiwiTm90Y2gzIiwiUGVjYW0xIiwiTHl2ZTEiLCJGY2VyMWciLCJDMXFhIiwiQ2QzZyIsIlBscDEiLCJNcHoiLCJBc2NsMSIsIkNoZ2EiLCJTbmFwMjUiLCJNa2k2NyIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0ic3BlY2lmaWNfdHlwZSIsZ3JvdXAuY2V4ID0gMzAsY2V4LnJvdz0zMCxjZWxscy51c2UgPSBzZXVyYXRfRTE1RTE2UDFQNF93dEBjZWxsLm5hbWVzWyEoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGUgJWluJSBjKCJUaHlyb2lkIiwiRG91YmxldCIsIlJCQyIpKV0sZ3JvdXAub3JkZXIgPSBjKCJDeWNsaW5nRXBpdGhlbGlhbCIsIkJhc2FsIiwiVHJhbnNpdGlvbmFsIiwiU2VjcmV0b3J5IiwiQ2lsaWF0ZWQiLCJDaWxpYVNlY3JldG9yeSIsIkZpYnJvYmxhc3QiLCJDeWNsaW5nRmlicm9ibGFzdCIsIk1lc2VuY2h5bWFsUHJvZ2VuaXRvciIsIkNob25kcm9jeXRlIiwiTXVzY2xlIiwiVlNNQy9wZXJpY3l0ZSIsIkx5bXBoYXRpY0VuZG90aGVsaWFsIiwiVmFzY3VsYXJFbmRvdGhlbGlhbCIsIkltbXVuZV8xIiwiSW1tdW5lXzIiLCJTY2h3YW5uQ2VsbCIsIk5ldXJvbi9ORUMiKQogICkKYGBgCgoKIyMjIyMgZmluZCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgYmV0d2VlbiBjbHVzdGVycyBvZiBpbnRlcmVzdDoKYGBge3J9CnNldXJhdF9FMTVFMTZQMVA0X3d0IDwtIFNldEFsbElkZW50KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBpZCA9ICJyZXMuMS40IikKCkUxNUUxNlAxUDRfd3RfcmVzMTRfQmFzYWxTZWNyZXRvcnk8LUZpbmRNYXJrZXJzKHNldXJhdF9FMTVFMTZQMVA0X3d0LGlkZW50LjE9Yyg5LDMwKSxvbmx5LnBvcyA9IFRSVUUpCkUxNUUxNlAxUDRfd3RfcmVzMTRfQmFzYWxTZWNyZXRvcnkKYGBgCgojIyMjIyBGb3IgdGhlIHB1cnBvc2Ugb2YgdmlzdWFsaXphdGlvbiwgd2UgYXZlcmFnZSB3aXRoaW4gZWFjaCBzcGVjaWZpYyBjZWxsIHR5cGU6CmBgYHtyfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGlkID0gInNwZWNpZmljX3R5cGUiKQphdmVyYWdlX3d0X3NwZWNpZmljX0Fubm90YXRpb248LUF2ZXJhZ2VFeHByZXNzaW9uKG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LHJldHVybi5zZXVyYXQgPSBUKQpgYGAKYGBge3IsZmlnLmhlaWdodD0xMixmaWcud2lkdGg9MTV9CgpEb0hlYXRtYXAob2JqZWN0ID0gYXZlcmFnZV93dF9zcGVjaWZpY19Bbm5vdGF0aW9uLCBnZW5lcy51c2UgPSBjKCJFcGNhbSIsIlRycDYzIiwiS3J0NSIsIktydDgiLCJTY2diM2EyIiwiU3BkZWYiLCJDcmViM2wxIiwiR3AyIiwiRm94ajEiLCJUd2lzdDIiLCJXbnQyIiwiTHk2YSIsIlRoeTEiLCJTb3g5IiwiQWNhbiIsIkFjdGEyIiwiTXloMTEiLCJSZ3M1IiwiTm90Y2gzIiwiUGVjYW0xIiwiTHl2ZTEiLCJGY2VyMWciLCJDMXFhIiwiQ2QzZyIsIlBscDEiLCJNcHoiLCJBc2NsMSIsIkNoZ2EiLCJTbmFwMjUiLCJNa2k2NyIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5jZXggPSAzMCxjZXgucm93PTIwLGNlbGxzLnVzZSA9IGF2ZXJhZ2Vfd3Rfc3BlY2lmaWNfQW5ub3RhdGlvbkBjZWxsLm5hbWVzWyEoYXZlcmFnZV93dF9zcGVjaWZpY19Bbm5vdGF0aW9uQGNlbGwubmFtZXMgJWluJSBjKCJUaHlyb2lkIiwiRG91YmxldCIsIlJCQyIpKV0sZ3JvdXAub3JkZXIgPSBjKCJDeWNsaW5nRXBpdGhlbGlhbCIsIkJhc2FsIiwiVHJhbnNpdGlvbmFsIiwiU2VjcmV0b3J5IiwiQ2lsaWF0ZWQiLCJDaWxpYVNlY3JldG9yeSIsIkZpYnJvYmxhc3QiLCJDeWNsaW5nRmlicm9ibGFzdCIsIk1lc2VuY2h5bWFsUHJvZ2VuaXRvciIsIkNob25kcm9jeXRlIiwiTXVzY2xlIiwiVlNNQy9wZXJpY3l0ZSIsIkx5bXBoYXRpY0VuZG90aGVsaWFsIiwiVmFzY3VsYXJFbmRvdGhlbGlhbCIsIkltbXVuZV8xIiwiSW1tdW5lXzIiLCJTY2h3YW5uQ2VsbCIsIk5ldXJvbi9ORUMiKSkKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTEyfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGlkID0gInNwZWNpZmljX3R5cGUiKQojIGp1c3QgdG8gcGxvdCBkaWZmZXJlbnQgY2VsbCB0eXBlcyBieSBhIGN1c3RvbSBvcmRlcjoKc2V1cmF0X0UxNUUxNlAxUDRfd3RAaWRlbnQgPSBmYWN0b3Ioc2V1cmF0X0UxNUUxNlAxUDRfd3RAaWRlbnQsbGV2ZWxzKHNldXJhdF9FMTVFMTZQMVA0X3d0QGlkZW50KVtjKDUsMSwxOSwxNyw0LDMsMTQsMTYsMjAsMTEsOSwxMCwxMywyMSwxMiwyLDgsNiwxOCwxNSw3KV0pCkRvdFBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGNvbHMudXNlID0gYygibGlnaHRncmV5IiwicmVkIiksZ2VuZXMucGxvdCA9IGMoIkFubzEiLCJDZnRyIiwiTHJyYzhhIiwiQ2xjYTNhMSIsIkNsY2EzYTIiLCJDbGNhM2IiLCJDbGNhNGEiLCJDbGNhNGIiLCJDbGNjMSIsIkNsY24yIiwiQ2xjbjMiLCJDbGNuNCIsIkNsY243IiwiQ2xjbmthIiwiQ2xjbmtiIiwiQ2xjYTEiLCJDbGNhMiIsIkdhYnJwIiwiQW5vMiIsIkNsY24xIiwiQ2xjbjUiLCJDbGljMyIpLGdyb3VwLmJ5ID0gImlkZW50IiwgeC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQpICMgb3RoZXIgY2hsb3JpZGUgY2hhbm5lbHMKYGBgCmBgYHtyfQpwcmludChsZXZlbHMoc2V1cmF0X0UxNUUxNlAxUDRfd3RAaWRlbnQpKQpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9NixmaWcud2lkdGg9MTJ9CnNldXJhdF9FMTVFMTZQMVA0X3d0PC1TZXRBbGxJZGVudChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgaWQgPSAic3BlY2lmaWNfdHlwZSIpCgpzZXVyYXRfRTE1RTE2UDFQNF93dEBpZGVudCA9IGZhY3RvcihzZXVyYXRfRTE1RTE2UDFQNF93dEBpZGVudCxsZXZlbHMoc2V1cmF0X0UxNUUxNlAxUDRfd3RAaWRlbnQpW2MoNSwxLDE5LDE3LDQsMywxNCwxNiwyMCwxMSw5LDEwLDEzLDIxLDEyLDIsOCw2LDE4LDE1LDcpXSkKRG90UGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgY29scy51c2UgPSBjKCJsaWdodGdyZXkiLCJyZWQiKSxnZW5lcy5wbG90ID0gYygiTWtpNjciLCJFcGNhbSIsIlRycDYzIiwiTXVjNWFjIiwiU3BkZWYiLCJDcmViM2wxIiwiR3AyIiwiRm94ajEiLCJTbmFwMjUiLCJDaGdhIiwiUGxwMSIsIk1weiIsIlBlY2FtMSIsIkx5dmUxIiwiRmNlcjFnIiwiQzFxYSIsIkNkM2ciLCJBY3RhMiIsIk15aDExIiwiUmdzNSIsIk5vdGNoMyIsIldudDIiLCJMeTZhIiwiVGh5MSIsIkNkMzQiLCJBY2FuIiwiQ29sMmExIiwiVHdpc3QyIiksZ3JvdXAuYnkgPSAiaWRlbnQiLCB4LmxhYi5yb3QgPSBULHBsb3QubGVnZW5kID0gVCkKYGBgCgojIyMjIyBlcGl0aGxpYWwgY2VsbHMgYWNyb3NzIGFnZXM6CmBgYHtyLGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTE1fQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGlkID0gInJlcy4xLjQiKQoKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZmVhdHVyZXMucGxvdCA9IGMoIlRycDYzIiwiU3BkZWYiLCJDcmViM2wxIiwiRm94ajEiLCJDZWxsQ3ljbGVfc2NvcmUiKSwgbkNvbCA9IDUseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMixpZGVudC5pbmNsdWRlID0gYygxMSw4LDMsOSwxLDI5LDMwLDIsNywyMCwyNywyOCksZ3JvdXAuYnk9ImFnZSIsIGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04fQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGlkID0gInJlcy4xLjQiKQoKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZmVhdHVyZXMucGxvdCA9IGMoIkNmdHIiLCJBbm8xIiksIG5Db2wgPSAyLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjIsaWRlbnQuaW5jbHVkZSA9IGMoMTEsOCwzLDksMSwyOSwzMCwyLDcsMjAsMjcsMjgpLGdyb3VwLmJ5PSJhZ2UiLCBsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpCmBgYAoKYGBge3J9CmRmX3d0PC1GZXRjaERhdGEoc2V1cmF0X0UxNUUxNlAxUDRfd3QsYygiQW5vMSIsIkNmdHIiLCJLcnQ0IiwiS3J0MTMiLCJyZXMuMS40IiwiYWdlIiwic2VxX2dyb3VwIiwiY2VsbF90eXBlIiwic3BlY2lmaWNfdHlwZSIpKQoKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9MTB9CmdncGxvdChkZl93dFtkZl93dCRyZXMuMS40ICVpbiUgYygxMSw4LDMsOSwxLDI5LDMwLDIsNywyMCwyNywyOCksXSxhZXMoc3BlY2lmaWNfdHlwZSxDZnRyKSkrZmFjZXRfZ3JpZCgufmFnZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhjb2xvcj1hZ2UsZmlsbD1hZ2UpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjAxOCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSkpCmBgYApgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9M30KZ2dwbG90KGRmX3d0W2RmX3d0JHJlcy4xLjQgJWluJSBjKDExLDgsMyw5LDEsMjksMzAsMiw3LDIwLDI3LDI4KSxdLGFlcyhhZ2UsQ2Z0cikpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1hZ2UpLGJpbndpZHRoPTAuMDcsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjAxOCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSkpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWFnZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTN9CmdncGxvdChkZl93dFtkZl93dCRyZXMuMS40ICVpbiUgYygxMSw4LDMsOSwxLDI5LDMwLDIsNywyMCwyNywyOCksXSxhZXMoYWdlLEFubzEpKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9YWdlKSxiaW53aWR0aD0wLjA3LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4wMTgpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1hZ2UpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkKYGBgCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0xMH0KZ2dwbG90KGRmX3d0W2RmX3d0JHJlcy4xLjQgJWluJSBjKDExLDgsMyw5LDEsMjksMzAsMiw3LDIwLDI3LDI4KSxdLGFlcyhzcGVjaWZpY190eXBlLEFubzEpKStmYWNldF9ncmlkKC5+YWdlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGNvbG9yPWFnZSxmaWxsPWFnZSksYmlud2lkdGg9MC4wNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMDE4KSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9MTB9CmdncGxvdChkZl93dFtkZl93dCRyZXMuMS40ICVpbiUgYygxMSw4LDMsOSwxLDI5LDMwLDIsNywyMCwyNywyOCksXSxhZXMoYWdlLEFubzEpKStmYWNldF9ncmlkKC5+c3BlY2lmaWNfdHlwZSkrZ2VvbV9kb3RwbG90KGJpbmF4aXM9InkiLGFlcyhjb2xvcj1hZ2UsZmlsbD1hZ2UpLGJpbndpZHRoPTAuMDUsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjAxOCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSkpCmBgYAoKIyMjIyMgYW55IHBvc3NpYmxlIGlvbm9jeXRlcz86CmBgYHtyLGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTE1fQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBmZWF0dXJlcy5wbG90ID0gYygiQ2Z0ciIsIkZveGkxIiksIG5Db2wgPSAyLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjIsaWRlbnQuaW5jbHVkZSA9IGMoMTEsOCwzLDksMSwyOSwzMCwyLDcsMjAsMjcsMjgpLGdyb3VwLmJ5PSJhZ2UiLCBsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpCmBgYApgYGB7cn0KdGFibGUoZGZfYWxsX3d0JHJlcy4xLjRbZGZfYWxsX3d0JEZveGkxPjBdKQoKYGBgCgpgYGB7cn0KdGFibGUoZGZfYWxsX3d0JHJlcy4xLjRbZGZfYWxsX3d0JENmdHI+MCAmIGRmX2FsbF93dCRGb3hpMT4wXSkKCmBgYAojIyMjIyBlcGl0aGVsaWFsIGNlbGwgY29tcG9zaXRpb24gYWNyb3NzIGFnZXM6CmBgYHtyLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NX0KZ2dwbG90KGRhdGE9c2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhW3NldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxMSw4LDMsOSwxLDI5LDMwLDIsNywyMCwyNywyOCksXSxhZXMoYWdlLGZpbGw9c3BlY2lmaWNfdHlwZSkpKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYApgYGB7cn0KdGFibGUoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJGFnZVtzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMTEsOCwzLDksMSwyOSwzMCwyLDcsMjAsMjcsMjgpXSxzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkY2VsbF90eXBlW3NldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxMSw4LDMsOSwxLDI5LDMwLDIsNywyMCwyNywyOCldKQpgYGAKCiMjIyMjIGEgZmV3IGxpbmVhZ2UgbWFya2VyczoKYGBge3IsZmlnLmhlaWdodD0yMCxmaWcud2lkdGg9MjB9ClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGZlYXR1cmVzLnBsb3QgPSBjKCJTb3gxMCIsIk1weiIsIlNoaCIsIlBob3gyYSIsIlBob3gyYiIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0ic3BlY2lmaWNfdHlwZSIpCgpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9MjJ9CnNldXJhdF9FMTVFMTZQMVA0X3d0PWJ1aWxkQ2x1c3RlclRyZWUoc2V1cmF0X0UxNUUxNlAxUDRfd3QsZG8ucmVvcmRlciA9IEYscmVvcmRlci5udW1lcmljID0gRixwY3MudXNlID0gMToyNCkKCmBgYAoKIyMjIyMgcG90ZW50aWFsIG1lc2VuY2h5bWFsIHByb2dlbml0b3JzOgpgYGB7cn0KRTE1RTE2UDFQNF93dF9yZXMxNF8yMm92ZXIzMzwtRmluZE1hcmtlcnMoc2V1cmF0X0UxNUUxNlAxUDRfd3QsaWRlbnQuMT1jKDIyKSxpZGVudC4yID0gYygzMyksb25seS5wb3MgPSBUUlVFKQpFMTVFMTZQMVA0X3d0X3JlczE0XzIyb3ZlcjMzCmBgYApgYGB7cn0KRTE1RTE2UDFQNF93dF9yZXMxNF8zM292ZXIyMjwtRmluZE1hcmtlcnMoc2V1cmF0X0UxNUUxNlAxUDRfd3QsaWRlbnQuMT1jKDMzKSxpZGVudC4yID0gYygyMiksb25seS5wb3MgPSBUUlVFKQpFMTVFMTZQMVA0X3d0X3JlczE0XzMzb3ZlcjIyCmBgYApgYGB7cn0KRTE1RTE2UDFQNF93dF9yZXMxNF8yNW92ZXIyMjwtRmluZE1hcmtlcnMoc2V1cmF0X0UxNUUxNlAxUDRfd3QsaWRlbnQuMT1jKDI1KSxpZGVudC4yID0gYygyMiksb25seS5wb3MgPSBUUlVFKQpFMTVFMTZQMVA0X3d0X3JlczE0XzI1b3ZlcjIyCmBgYAoKYGBge3IsZmlnLmhlaWdodD01LGZpZy53aWR0aD0yNX0KVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZmVhdHVyZXMucGxvdCA9IGMoIlBpZXpvMiIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0icmVzLjEuNCIpCgpgYGAKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD00N30Kc2V1cmF0X0UxNUUxNlAxUDRfd3QgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGlkID0gInJlcy4xLjQiKQoKRG9IZWF0bWFwKG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBnZW5lcy51c2UgPSBjKCJTb3g5IiwiQWNhbiIsIkNvbDJhMSIsIlBpZXpvMiIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0icmVzLjEuNCIsZ3JvdXAuY2V4ID0gNDAsY2V4LnJvdz00MCxjZWxscy51c2UgPSBzZXVyYXRfRTE1RTE2UDFQNF93dEBjZWxsLm5hbWVzW3NldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygxNCwzMSwyMywxOCwyMSwxMywxNSwxOSwxNiwxMCwxMiw2LDQsMTcsMCw1LDMzLDIyLDI1KV0sZ3JvdXAub3JkZXIgPSBjKDEwLDMzLDEyLDYsMCwyMiw1LDQsMTMsMTgsMTcsMjUsMTUsMTksMjEsMTYsMTQsMzEsMjMpCiAgKQpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9MTUsZmlnLndpZHRoPTQ2fQpzZXVyYXRfRTE1RTE2UDFQNF93dCA8LSBTZXRBbGxJZGVudChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgaWQgPSAicmVzLjEuNCIpCgpEb0hlYXRtYXAob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGdlbmVzLnVzZSA9IGMoIldudDIiLCJDZDM0IiwiUHJtdDEiLCJFZ2ZsNiIsIkNyYWJwMiIsIlBpZXpvMiIsIlJlZzNnIiwiWWJ4MyIsIktsZjkiLCJaZnAzNiIsIkxwbCIsIlB0cmYiLCJMeTZhIiwiVHBwcDMiLCJBbnhhMSIsIkx5NmMxIiwiUGkxNiIsIlRoeTEiLCJBbnhhMyIsIkNjbDciLCJDY2wyIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJyZXMuMS40Iixncm91cC5jZXggPSA0MCxjZXgucm93PTQwLGNlbGxzLnVzZSA9IHNldXJhdF9FMTVFMTZQMVA0X3d0QGNlbGwubmFtZXNbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDMzLDIyLDI1KV0sZ3JvdXAub3JkZXIgPSBjKDMzLDIyLDI1KQogICkKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTE1LGZpZy53aWR0aD00Nn0Kc2V1cmF0X0UxNUUxNlAxUDRfd3QgPC0gU2V0QWxsSWRlbnQob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGlkID0gInJlcy4xLjQiKQoKRG9IZWF0bWFwKG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBnZW5lcy51c2UgPSBjKCJXbnQyIiwiQ2QzNCIsIlBybXQxIiwiRWdmbDYiLCJDcmFicDIiLCJQaWV6bzIiLCJTb3N0ZGMxIiwiWWJ4MyIsIktsZjkiLCJaZnAzNiIsIlB0cmYiLCJMcGwiLCJMeTZhIiwiVHBwcDMiLCJMeTZjMSIsIlBpMTYiLCJUaHkxIiwiQW54YTMiLCJBbnhhMSIsIkNjbDciLCJDY2wyIiksIAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJhZ2UiLGdyb3VwLmNleCA9IDQwLGNleC5yb3c9NDAsY2VsbHMudXNlID0gc2V1cmF0X0UxNUUxNlAxUDRfd3RAY2VsbC5uYW1lc1tzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMzMsMjIsMjUpXQogICkKYGBgCgojIyMjIyBzY0dQUyAoc2NvcmluZyk6CgpgYGB7cn0KZ2VuZUxpc3Q8LXJlYWQuY3N2KGZpbGUgPSAiR2VuZXNPTUlNX2FsbC50eHQiLGhlYWRlcj1ULHNlcD0iXHQiLHN0cmluZ3NBc0ZhY3RvcnMgPSBGKSAKIyBHZW5lc19zY0dQU19hbGwudHh0IGFuZCBHZW5lc09NSU1fYWxsLnR4dCBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUuIEJvdGggZmlsZXMgY2FuIGJlIHVzZWQgaGVyZS4KZ2VuZUxpc3Q8LWxhcHBseShnZW5lTGlzdCxmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHgpLHNwbGl0PSIsIikpKSAKaGVhZChnZW5lTGlzdCRNdWNvY2lsaWFyeSkKYGBgCgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCnBlcmNlbnRpbGVfdGFibGVfRTE1RTE2UDFQNHd0PC1hcHBseShzZXVyYXRfRTE1RTE2UDFQNF93dEBkYXRhLDEscGVyY2VudF9yYW5rKQpgYGAKYGBge3J9CnBlcmNlbnRpbGVfdGFibGVfRTE1RTE2UDFQNHd0WzE6NiwxOjZdICAjanVzdCB0byB0YWtlIGEgbG9vayBhdCB0aGUgcGVyY2VudF9yYW5rCgpgYGAKYGBge3J9CiBDZWxsQ3ljbGVfc2NvcmVfd3Q8LSBhcHBseShwZXJjZW50aWxlX3RhYmxlX0UxNUUxNlAxUDR3dFssY29sbmFtZXMocGVyY2VudGlsZV90YWJsZV9FMTVFMTZQMVA0d3QpICVpbiUgZ2VuZUxpc3QkQ2VsbF9jeWNsZV0sMSxtZWFuKQpgYGAKYGBge3J9CiBoZWFkKCBDZWxsQ3ljbGVfc2NvcmVfd3QpCmBgYApgYGB7cn0Kc2V1cmF0X0UxNUUxNlAxUDRfd3Q8LUFkZE1ldGFEYXRhKG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBtZXRhZGF0YSA9IENlbGxDeWNsZV9zY29yZV93dCwgY29sLm5hbWUgPSAiQ2VsbEN5Y2xlX3Njb3JlIikKCmBgYApgYGB7cixmaWcuaGVpZ2h0PTUsZmlnLndpZHRoPTI1fQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBmZWF0dXJlcy5wbG90ID0gYygiQ2VsbEN5Y2xlX3Njb3JlIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJyZXMuMS40IikKCmBgYApgYGB7cn0Kd3RfbW9jb3NhR29ibGV0X3Njb3JlPC0gYXBwbHkocGVyY2VudGlsZV90YWJsZV9FMTVFMTZQMVA0d3RbLGNvbG5hbWVzKHBlcmNlbnRpbGVfdGFibGVfRTE1RTE2UDFQNHd0KSAlaW4lIGdlbmVMaXN0JE11Y29zYS5lcGl0aGVsaXVtLmdvYmxldF0sMSxtZWFuKQpgYGAKCmBgYHtyfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtQWRkTWV0YURhdGEob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIG1ldGFkYXRhID0gd3RfbW9jb3NhR29ibGV0X3Njb3JlLCBjb2wubmFtZSA9ICJtdWNvc2FHb2JsZXRfc2NvcmUiKQoKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9NSxmaWcud2lkdGg9MjV9ClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGZlYXR1cmVzLnBsb3QgPSBjKCJtdWNvc2FHb2JsZXRfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9NSxmaWcud2lkdGg9MjV9ClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGZlYXR1cmVzLnBsb3QgPSBjKCJtdWNvc2FHb2JsZXRfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiLGRvLnNvcnQgPSBUKQoKYGBgCgoKYGBge3J9CiB3dF9jaWxpb3BhdGh5X3RhYmxlPC0gcGVyY2VudGlsZV90YWJsZV9FMTVFMTZQMVA0d3RbLGNvbG5hbWVzKHBlcmNlbnRpbGVfdGFibGVfRTE1RTE2UDFQNHd0KSAlaW4lIGdlbmVMaXN0JENpbGlvcGF0aHldCmBgYApgYGB7cn0KIHd0X2NpbGlvcGF0aHlfc2NvcmU8LSBhcHBseSh3dF9jaWxpb3BhdGh5X3RhYmxlLDEsbWVhbikKYGBgCmBgYHtyfQogaGVhZCh3dF9jaWxpb3BhdGh5X3Njb3JlKQpgYGAKYGBge3J9CnNldXJhdF9FMTVFMTZQMVA0X3d0PC1BZGRNZXRhRGF0YShvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgbWV0YWRhdGEgPSB3dF9jaWxpb3BhdGh5X3Njb3JlLCBjb2wubmFtZSA9ICJjaWxpb3BhdGh5X3Njb3JlIikKCmBgYApgYGB7cixmaWcuaGVpZ2h0PTUsZmlnLndpZHRoPTI1fQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBmZWF0dXJlcy5wbG90ID0gYygiY2lsaW9wYXRoeV9zY29yZSIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0icmVzLjEuNCIpCgpgYGAKYGBge3J9CiB3dF9QQ0Rfc2NvcmU8LSBhcHBseShwZXJjZW50aWxlX3RhYmxlX0UxNUUxNlAxUDR3dFssY29sbmFtZXMocGVyY2VudGlsZV90YWJsZV9FMTVFMTZQMVA0d3QpICVpbiUgZ2VuZUxpc3QkUHJpbWFyeS5jaWxpYXJ5LmR5c2tpbmVzaWFdLDEsbWVhbikKYGBgCmBgYHtyfQogaGVhZCh3dF9QQ0Rfc2NvcmUpCmBgYAoKYGBge3J9CnNldXJhdF9FMTVFMTZQMVA0X3d0PC1BZGRNZXRhRGF0YShvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgbWV0YWRhdGEgPSB3dF9QQ0Rfc2NvcmUsIGNvbC5uYW1lID0gIlBDRF9zY29yZSIpCgpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9NSxmaWcud2lkdGg9MjV9ClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGZlYXR1cmVzLnBsb3QgPSBjKCJQQ0Rfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTUsZmlnLndpZHRoPTEwfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQoc2V1cmF0X0UxNUUxNlAxUDRfd3QsaWQ9InNwZWNpZmljX3R5cGUiKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBmZWF0dXJlcy5wbG90ID0gYygiUENEX3Njb3JlIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJzcGVjaWZpY190eXBlIixkby5zb3J0ID0gRixpZGVudC5pbmNsdWRlID0gYygiQ3ljbGluZ0VwaXRoZWxpYWwiLCJCYXNhbCIsIlRyYW5zaXRpb25hbCIsIlNlY3JldG9yeSIsIkNpbGlhdGVkIiwiQ2lsaWFTZWNyZXRvcnkiLCJGaWJyb2JsYXN0IiwiQ3ljbGluZ0ZpYnJvYmxhc3QiLCJNZXNlbmNoeW1hbFByb2dlbml0b3IiLCJDaG9uZHJvY3l0ZSIsIk11c2NsZSIsIlZTTUMvcGVyaWN5dGUiLCJMeW1waGF0aWNFbmRvdGhlbGlhbCIsIlZhc2N1bGFyRW5kb3RoZWxpYWwiLCJJbW11bmVfMSIsIkltbXVuZV8yIiwiU2Nod2FubkNlbGwiLCJOZXVyb24vTkVDIikpCgpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQoKZ2dwbG90KHNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YVtzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkc3BlY2lmaWNfdHlwZSAlaW4lIGMoIkNpbGlhdGVkIiwiQ2lsaWFTZWNyZXRvcnkiKSxdLGFlcyhhZ2UsUENEX3Njb3JlKSkrZmFjZXRfZ3JpZCgufnNwZWNpZmljX3R5cGUpK2dlb21fZG90cGxvdChiaW5heGlzPSJ5IixhZXMoZmlsbD1hZ2UpLGJpbndpZHRoPTAuMDEsc3RhY2tkaXI9ImNlbnRlciIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC44KSwgZG90c2l6ZT0wLjIpK3N0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IGxpc3QoYygiRTE2IiwgIlAxIiksYygiUDEiLCAiUDQiKSxjKCJFMTYiLCAiUDQiKSksbWV0aG9kPSJ3aWxjb3gudGVzdCIsc2l6ZT00LGxhYmVsPSJwLmFkaiIpKyBzdGF0X3N1bW1hcnkoYWVzKGNvbG9yPWFnZSksZnVuLmRhdGE9bWVhbl9zZGwsIGZ1bi5hcmdzID0gbGlzdChtdWx0PTEpLCAKICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSxzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGNvbG91ciA9ICJibGFjayIsIGFuZ2xlID0gMCkpCmBgYAoKCgoKYGBge3IsZmlnLmhlaWdodD01LGZpZy53aWR0aD0zfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQoc2V1cmF0X0UxNUUxNlAxUDRfd3QsaWQ9InNwZWNpZmljX3R5cGUiKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBmZWF0dXJlcy5wbG90ID0gYygiUENEX3Njb3JlIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJhZ2UiLGRvLnNvcnQgPSBGLGlkZW50LmluY2x1ZGUgPSBjKCJDaWxpYVNlY3JldG9yeSIpKQoKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTUsZmlnLndpZHRoPTEwfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQoc2V1cmF0X0UxNUUxNlAxUDRfd3QsaWQ9InNwZWNpZmljX3R5cGUiKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBmZWF0dXJlcy5wbG90ID0gYygibXVjb3NhR29ibGV0X3Njb3JlIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJzcGVjaWZpY190eXBlIixkby5zb3J0ID0gRixpZGVudC5pbmNsdWRlID0gYygiQ3ljbGluZ0VwaXRoZWxpYWwiLCJCYXNhbCIsIlRyYW5zaXRpb25hbCIsIlNlY3JldG9yeSIsIkNpbGlhdGVkIiwiQ2lsaWFTZWNyZXRvcnkiLCJGaWJyb2JsYXN0IiwiQ3ljbGluZ0ZpYnJvYmxhc3QiLCJNZXNlbmNoeW1hbFByb2dlbml0b3IiLCJDaG9uZHJvY3l0ZSIsIk11c2NsZSIsIlZTTUMvcGVyaWN5dGUiLCJMeW1waGF0aWNFbmRvdGhlbGlhbCIsIlZhc2N1bGFyRW5kb3RoZWxpYWwiLCJJbW11bmVfMSIsIkltbXVuZV8yIiwiU2Nod2FubkNlbGwiLCJOZXVyb24vTkVDIikpCgpgYGAKYGBge3IsZmlnLmhlaWdodD01LGZpZy53aWR0aD0zfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQoc2V1cmF0X0UxNUUxNlAxUDRfd3QsaWQ9InNwZWNpZmljX3R5cGUiKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBmZWF0dXJlcy5wbG90ID0gYygibXVjb3NhR29ibGV0X3Njb3JlIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJhZ2UiLGRvLnNvcnQgPSBGLGlkZW50LmluY2x1ZGUgPSBjKCJTZWNyZXRvcnkiKSkKCmBgYApgYGB7cixmaWcuaGVpZ2h0PTUsZmlnLndpZHRoPTN9CnNldXJhdF9FMTVFMTZQMVA0X3d0PC1TZXRBbGxJZGVudChzZXVyYXRfRTE1RTE2UDFQNF93dCxpZD0ic3BlY2lmaWNfdHlwZSIpClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGZlYXR1cmVzLnBsb3QgPSBjKCJtdWNvc2FHb2JsZXRfc2NvcmUiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9ImFnZSIsZG8uc29ydCA9IEYsaWRlbnQuaW5jbHVkZSA9IGMoIkNpbGlhU2VjcmV0b3J5IikpCgpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQoKZ2dwbG90KHNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YVtzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkc3BlY2lmaWNfdHlwZSAlaW4lIGMoIlNlY3JldG9yeSIsIkNpbGlhU2VjcmV0b3J5IiksXSxhZXMoYWdlLG11Y29zYUdvYmxldF9zY29yZSkpK2ZhY2V0X2dyaWQoLn5zcGVjaWZpY190eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9YWdlKSxiaW53aWR0aD0wLjAxLHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKStzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBsaXN0KGMoIkUxNiIsICJQMSIpLGMoIlAxIiwgIlA0IiksYygiRTE2IiwgIlA0IikpLG1ldGhvZD0id2lsY294LnRlc3QiLHNpemU9NCxsYWJlbD0icC5hZGoiKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1hZ2UpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSksc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBjb2xvdXIgPSAiYmxhY2siLCBhbmdsZSA9IDApKQpgYGAKCmBgYHtyfQogd3RfYnJvbmNoaXRpc19zY29yZTwtIGFwcGx5KHBlcmNlbnRpbGVfdGFibGVfRTE1RTE2UDFQNHd0Wyxjb2xuYW1lcyhwZXJjZW50aWxlX3RhYmxlX0UxNUUxNlAxUDR3dCkgJWluJSBnZW5lTGlzdCRCcm9uY2hpZWN0YXNpcy5hbmQuQnJvbmNoaXRpc10sMSxtZWFuKQpgYGAKYGBge3J9CiBoZWFkKHd0X2Jyb25jaGl0aXNfc2NvcmUpCmBgYAoKYGBge3J9CnNldXJhdF9FMTVFMTZQMVA0X3d0PC1BZGRNZXRhRGF0YShvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgbWV0YWRhdGEgPSB3dF9icm9uY2hpdGlzX3Njb3JlLCBjb2wubmFtZSA9ICJCcm9uY2hpZWN0YXNpc19Ccm9uY2hpdGlzIikKCmBgYAoKYGBge3IsZmlnLmhlaWdodD01LGZpZy53aWR0aD0yNX0KVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZmVhdHVyZXMucGxvdCA9IGMoIkJyb25jaGllY3Rhc2lzX0Jyb25jaGl0aXMiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9NSxmaWcud2lkdGg9MTB9CnNldXJhdF9FMTVFMTZQMVA0X3d0PC1TZXRBbGxJZGVudChzZXVyYXRfRTE1RTE2UDFQNF93dCxpZD0ic3BlY2lmaWNfdHlwZSIpClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGZlYXR1cmVzLnBsb3QgPSBjKCJCcm9uY2hpZWN0YXNpc19Ccm9uY2hpdGlzIiksIG5Db2wgPSAxLHgubGFiLnJvdCA9IFQscG9pbnQuc2l6ZS51c2UgPSAwLjMsdXNlLnJhdz1GLGdyb3VwLmJ5PSJzcGVjaWZpY190eXBlIixkby5zb3J0ID0gRixpZGVudC5pbmNsdWRlID0gYygiQ3ljbGluZ0VwaXRoZWxpYWwiLCJCYXNhbCIsIlRyYW5zaXRpb25hbCIsIlNlY3JldG9yeSIsIkNpbGlhdGVkIiwiQ2lsaWFTZWNyZXRvcnkiLCJGaWJyb2JsYXN0IiwiQ3ljbGluZ0ZpYnJvYmxhc3QiLCJNZXNlbmNoeW1hbFByb2dlbml0b3IiLCJDaG9uZHJvY3l0ZSIsIk11c2NsZSIsIlZTTUMvcGVyaWN5dGUiLCJMeW1waGF0aWNFbmRvdGhlbGlhbCIsIlZhc2N1bGFyRW5kb3RoZWxpYWwiLCJJbW11bmVfMSIsIkltbXVuZV8yIiwiU2Nod2FubkNlbGwiLCJOZXVyb24vTkVDIikpCgpgYGAKCgoKYGBge3J9CiB3dF9DT1BEX3Njb3JlPC0gYXBwbHkocGVyY2VudGlsZV90YWJsZV9FMTVFMTZQMVA0d3RbLGNvbG5hbWVzKHBlcmNlbnRpbGVfdGFibGVfRTE1RTE2UDFQNHd0KSAlaW4lIGdlbmVMaXN0JENPUERdLDEsbWVhbikKYGBgCmBgYHtyfQogaGVhZCh3dF9DT1BEX3Njb3JlKQpgYGAKCmBgYHtyfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtQWRkTWV0YURhdGEob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIG1ldGFkYXRhID0gd3RfQ09QRF9zY29yZSwgY29sLm5hbWUgPSAiQ09QRCIpCgpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTUsZmlnLndpZHRoPTEwfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQoc2V1cmF0X0UxNUUxNlAxUDRfd3QsaWQ9InNwZWNpZmljX3R5cGUiKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBmZWF0dXJlcy5wbG90ID0gYygiQ09QRCIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0ic3BlY2lmaWNfdHlwZSIsZG8uc29ydCA9IEYsaWRlbnQuaW5jbHVkZSA9IGMoIkN5Y2xpbmdFcGl0aGVsaWFsIiwiQmFzYWwiLCJUcmFuc2l0aW9uYWwiLCJTZWNyZXRvcnkiLCJDaWxpYXRlZCIsIkNpbGlhU2VjcmV0b3J5IiwiRmlicm9ibGFzdCIsIkN5Y2xpbmdGaWJyb2JsYXN0IiwiTWVzZW5jaHltYWxQcm9nZW5pdG9yIiwiQ2hvbmRyb2N5dGUiLCJNdXNjbGUiLCJWU01DL3BlcmljeXRlIiwiTHltcGhhdGljRW5kb3RoZWxpYWwiLCJWYXNjdWxhckVuZG90aGVsaWFsIiwiSW1tdW5lXzEiLCJJbW11bmVfMiIsIlNjaHdhbm5DZWxsIiwiTmV1cm9uL05FQyIpKQoKYGBgCgpgYGB7cn0KIHd0X2FzdGhtYV9zY29yZTwtIGFwcGx5KHBlcmNlbnRpbGVfdGFibGVfRTE1RTE2UDFQNHd0Wyxjb2xuYW1lcyhwZXJjZW50aWxlX3RhYmxlX0UxNUUxNlAxUDR3dCkgJWluJSBnZW5lTGlzdCRQdWxtb25hcnkuLi5Bc3RobWFdLDEsbWVhbikKYGBgCmBgYHtyfQogaGVhZCh3dF9hc3RobWFfc2NvcmUpCmBgYAoKYGBge3J9CnNldXJhdF9FMTVFMTZQMVA0X3d0PC1BZGRNZXRhRGF0YShvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgbWV0YWRhdGEgPSB3dF9hc3RobWFfc2NvcmUsIGNvbC5uYW1lID0gIkFzdGhtYSIpCgpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9NSxmaWcud2lkdGg9MTB9CnNldXJhdF9FMTVFMTZQMVA0X3d0PC1TZXRBbGxJZGVudChzZXVyYXRfRTE1RTE2UDFQNF93dCxpZD0ic3BlY2lmaWNfdHlwZSIpClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGZlYXR1cmVzLnBsb3QgPSBjKCJBc3RobWEiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InNwZWNpZmljX3R5cGUiLGRvLnNvcnQgPSBGLGlkZW50LmluY2x1ZGUgPSBjKCJDeWNsaW5nRXBpdGhlbGlhbCIsIkJhc2FsIiwiVHJhbnNpdGlvbmFsIiwiU2VjcmV0b3J5IiwiQ2lsaWF0ZWQiLCJDaWxpYVNlY3JldG9yeSIsIkZpYnJvYmxhc3QiLCJDeWNsaW5nRmlicm9ibGFzdCIsIk1lc2VuY2h5bWFsUHJvZ2VuaXRvciIsIkNob25kcm9jeXRlIiwiTXVzY2xlIiwiVlNNQy9wZXJpY3l0ZSIsIkx5bXBoYXRpY0VuZG90aGVsaWFsIiwiVmFzY3VsYXJFbmRvdGhlbGlhbCIsIkltbXVuZV8xIiwiSW1tdW5lXzIiLCJTY2h3YW5uQ2VsbCIsIk5ldXJvbi9ORUMiKSkKCmBgYApgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9N30KCmdncGxvdChzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGFbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHNwZWNpZmljX3R5cGUgJWluJSBjKCJTZWNyZXRvcnkiLCJDaWxpYVNlY3JldG9yeSIsIkltbXVuZV8xIiksXSxhZXMoYWdlLEFzdGhtYSkpK2ZhY2V0X2dyaWQoLn5zcGVjaWZpY190eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9YWdlKSxiaW53aWR0aD0wLjAwNSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuMikrc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbGlzdChjKCJFMTYiLCAiUDEiKSxjKCJQMSIsICJQNCIpLGMoIkUxNiIsICJQNCIpKSxtZXRob2Q9IndpbGNveC50ZXN0IixzaXplPTQsbGFiZWw9InAuYWRqIikrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9YWdlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAogICAgICAgICAgICAgICAgIGdlb209InBvaW50cmFuZ2UiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuNykpKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LGhqdXN0PTEpLHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgY29sb3VyID0gImJsYWNrIiwgYW5nbGUgPSAwKSkKYGBgCgojIyMjIyBjaGVjayBzb21lIGh1bWFuIEdXQVM6CgpgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTEwfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGlkID0gInNwZWNpZmljX3R5cGUiKQoKc2V1cmF0X0UxNUUxNlAxUDRfd3RAaWRlbnQgPSBmYWN0b3Ioc2V1cmF0X0UxNUUxNlAxUDRfd3RAaWRlbnQsbGV2ZWxzKHNldXJhdF9FMTVFMTZQMVA0X3d0QGlkZW50KVtjKDUsMSwxOSwxNyw0LDMsMTQsMTYsMjAsMTEsOSwxMCwxMywyMSwxMiwyLDgsNiwxOCwxNSw3KV0pCkRvdFBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGNvbHMudXNlID0gYygiZm9yZXN0Z3JlZW4iLCJtYWdlbnRhMyIpLGdlbmVzLnBsb3QgPSBjKCJNdWM0IiwiTXVjMjAiLCJBZ3RyMiIsIlNsYzZhMTQiLCJFaGYiLCJBcGlwIiwiSGhpcCIsIkNocm5hNSIsIkh0cjQiLCJBZGdyZzYiLCJUaHNkNCIsIkZhbTEzYSIsIkdzdGNkIiwiUmluMyIsIkFkYW0xOSIsIlRldDIiLCJFZWZzZWMiLCJDZmRwMSIsIlRnZmIyIiwiQWdlciIsIlNnZjI5IiwiQXJtYzIiLCJQaWQxIiwiRHNwIiwiTXRjbDEiLCJSYXJiIiwiU2Z0cGQiLCJDeXAyYTQiLCJDeXAyYTUiKSxncm91cC5ieSA9ICJpZGVudCIsIHgubGFiLnJvdCA9IFQscGxvdC5sZWdlbmQgPSBUKQpgYGAKCgojIyMjIyBDRiBHV0FTOgpgYGB7cixmaWcuaGVpZ2h0PTQsZmlnLndpZHRoPTZ9CnNldXJhdF9FMTVFMTZQMVA0X3d0PC1TZXRBbGxJZGVudChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgaWQgPSAic3BlY2lmaWNfdHlwZSIpCgpzZXVyYXRfRTE1RTE2UDFQNF93dEBpZGVudCA9IGZhY3RvcihzZXVyYXRfRTE1RTE2UDFQNF93dEBpZGVudCxsZXZlbHMoc2V1cmF0X0UxNUUxNlAxUDRfd3RAaWRlbnQpW2MoNSwxLDE5LDE3LDQsMywxNCwxNiwyMCwxMSw5LDEwLDEzLDIxLDEyLDIsOCw2LDE4LDE1LDcpXSkKRG90UGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgY29scy51c2UgPSBjKCJmb3Jlc3RncmVlbiIsIm1hZ2VudGEzIiksZ2VuZXMucGxvdCA9IGMoIk11YzQiLCJNdWMyMCIsIkFndHIyIiwiU2xjNmExNCIsIkVoZiIsIkFwbHAxIiwiQXBscDIiLCJIMi1BYSIsIkgyLUFiMSIsIkgyLUViMSIsIkgyLUViMiIpLGdyb3VwLmJ5ID0gImlkZW50IiwgeC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQpCmBgYAoKIyMjIyMgQ09QRDoKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD05fQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGlkID0gInNwZWNpZmljX3R5cGUiKQpzZXVyYXRfRTE1RTE2UDFQNF93dEBpZGVudCA9IGZhY3RvcihzZXVyYXRfRTE1RTE2UDFQNF93dEBpZGVudCxsZXZlbHMoc2V1cmF0X0UxNUUxNlAxUDRfd3RAaWRlbnQpW2MoNSwxLDE5LDE3LDQsMywxNCwxNiwyMCwxMSw5LDEwLDEzLDIxLDEyLDIsOCw2LDE4LDE1LDcpXSkKRG90UGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgY29scy51c2UgPSBjKCJmb3Jlc3RncmVlbiIsIm1hZ2VudGEzIiksZ2VuZXMucGxvdCA9IGMoIkhoaXAiLCJDaHJuYTUiLCJIdHI0IiwiQWRncmc2IiwiVGhzZDQiLCJGYW0xM2EiLCJHc3RjZCIsIlJpbjMiLCJBZGFtMTkiLCJUZXQyIiwiRWVmc2VjIiwiQ2ZkcDEiLCJUZ2ZiMiIsIkFnZXIiLCJTZ2YyOSIsIkFybWMyIiwiUGlkMSIsIkRzcCIsIk10Y2wxIiwiUmFyYiIsIlNmdHBkIiwiQ3lwMmE0IiwiQ3lwMmE1IiksZ3JvdXAuYnkgPSAiaWRlbnQiLCB4LmxhYi5yb3QgPSBULHBsb3QubGVnZW5kID0gVCkKYGBgCgojIyMjIyBEZXZlbG9wbWVudGFsIGxhbnNjYXBlOgojIyMjIyBiYXNhbCBjZWxscyBhY3Jvc3MgdGltZToKYGBge3J9CnNldXJhdF9FMTVFMTZQMVA0X3d0IDwtIFNldEFsbElkZW50KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBpZCA9ICJyZXMuMS40IikKCkUxNUUxNlAxUDRfd3RfcmVzMTRfM292ZXIxPC1GaW5kTWFya2VycyhzZXVyYXRfRTE1RTE2UDFQNF93dCxpZGVudC4xPWMoMyksaWRlbnQuMiA9IGMoMSksb25seS5wb3MgPSBUUlVFKQpFMTVFMTZQMVA0X3d0X3JlczE0XzNvdmVyMQpgYGAKCmBgYHtyfQp3cml0ZS50YWJsZShFMTVFMTZQMVA0X3d0X3JlczE0XzNvdmVyMSwiRTE1RTE2UDFQNF93dF9yZXMxNF8zb3ZlcjEudHh0IixzZXA9Ilx0IikKCmBgYAoKCmBgYHtyfQpFMTVFMTZQMVA0X3d0X3JlczE0XzFvdmVyMzwtRmluZE1hcmtlcnMoc2V1cmF0X0UxNUUxNlAxUDRfd3QsaWRlbnQuMT1jKDEpLGlkZW50LjIgPSBjKDMpLG9ubHkucG9zID0gVFJVRSkKRTE1RTE2UDFQNF93dF9yZXMxNF8xb3ZlcjMKYGBgCgpgYGB7cn0Kd3JpdGUudGFibGUoRTE1RTE2UDFQNF93dF9yZXMxNF8xb3ZlcjMsIkUxNUUxNlAxUDRfd3RfcmVzMTRfMW92ZXIzLnR4dCIsc2VwPSJcdCIpCgpgYGAKCgpgYGB7cn0KRTE1RTE2UDFQNF93dF9yZXMxNF8yOW92ZXIxPC1GaW5kTWFya2VycyhzZXVyYXRfRTE1RTE2UDFQNF93dCxpZGVudC4xPWMoMjkpLGlkZW50LjIgPSBjKDEpLG9ubHkucG9zID0gVFJVRSkKRTE1RTE2UDFQNF93dF9yZXMxNF8yOW92ZXIxCmBgYAoKYGBge3IsZmlnLmhlaWdodD0xNSxmaWcud2lkdGg9NDB9CgpEb0hlYXRtYXAob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiVHJwNjMiLCJDbGRuNiIsIk5uYXQiLCJJZDIiLCJJZDMiLCJXbnQ3YiIsIldudDYiLCJXbnQ0IiwiQm1wNyIsIktydDE1IiwiS3J0NSIsIkN5cDJmMiIsIkxicCIsIkJDMDQ4NTQ2IiwiTHk2ZSIsIkFxcDMiLCJBcXA0IiwiV250NCIsIlJldG5sYSIsIkl0bG4xIiwiTHRmIiwiU2NnYjFhMSIsIkFxcDUiLCJFcnJmaTEiLCJFcGFzMSIsIlJwbDktcHM2IiwiUnBsMTMtcHMzIiwiUnBsNmwiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQsZ3JvdXAuYnk9InJlcy4xLjQiLGdyb3VwLmNleCA9IDUwLGNleC5yb3c9NDAsY2VsbHMudXNlID0gc2V1cmF0X0UxNUUxNlAxUDRfd3RAY2VsbC5uYW1lc1tzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMyw4LDExLDksMSwzMCwyLDIwLDI5LDcsMjYsMjcsMjgsMjQpXSxncm91cC5vcmRlciA9IGMoMyw4LDExLDksMSwzMCwyLDIwLDI5LDcsMjcsMjgsMjYsMjQpCiAgKQpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9MjgsIGZpZy53aWR0aD0xMn0KVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZmVhdHVyZXMucGxvdCA9IGMoIkFxcDEiLCJBcXAyIiwiQXFwMyIsIkFxcDQiLCJBcXA1IiwiQXFwNiIsIkFxcDciLCJBcXA4IiwiQXFwOSIsIkFxcDExIiwiQXFwMTIiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMikKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTIwfQpEb0hlYXRtYXAob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGdlbmVzLnVzZSA9IGMoIlRycDYzIiwiQ2xkbjYiLCJObmF0IiwiSWQyIiwiSWQzIiwiV250N2IiLCJLcnQ1IiwiS3J0MTUiLCJLcnQxNCIsIldudDQiLCJCbXA3IiwiQXFwMyIsIkFxcDQiLCJBcXA1IiwiRXJyZmkxIiwiUnBsNmwiLCJScGw5LXBzNiIsIlJwbDEzLXBzMyIpLAogICAgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFLHVzZS5zY2FsZWQgPSBULGdyb3VwLmJ5PSJyZXMuMS40Iixncm91cC5jZXggPSA0MCxjZXgucm93PTI1LGNlbGxzLnVzZSA9IHNldXJhdF9FMTVFMTZQMVA0X3d0QGNlbGwubmFtZXNbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDMsMSwyOSldLGdyb3VwLm9yZGVyID0gYygzLDEsMjkpCiAgKQpgYGAKYGBge3J9CmRmXzNfMV8yOV93dDwtRmV0Y2hEYXRhKHNldXJhdF9FMTVFMTZQMVA0X3d0LGMoIlRycDYzIiwiQ2xkbjYiLCJObmF0IiwiSWQyIiwiSWQzIiwiV250N2IiLCJXbnQ0IiwiS3J0NSIsIktydDE1IiwiQXFwMyIsIkFxcDQiLCJBcXA1IiwiUnBsNmwiLCJScGw5LXBzNiIsIlJwbDEzLXBzMyIsImFnZSIsInJlcy4xLjQiKSkKZGZfM18xXzI5X3d0PC1kZl8zXzFfMjlfd3Rbb3JkZXIoZmFjdG9yKGRmXzNfMV8yOV93dCRyZXMuMS40LGxldmVscz1jKCIzIiwiMSIsIjI5IikpLGRmXzNfMV8yOV93dCRhZ2UpLF0KYGBgCmBgYHtyfQphZ2U8LXN1YnN0cihyb3duYW1lcyhkZl8zXzFfMjlfd3RbZGZfM18xXzI5X3d0JHJlcy4xLjQgJWluJSBjKDMsMSwyOSksXSksMSwzKQoKYGBgCgpgYGB7cn0KdGFibGUoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjQpCgpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdwbG90cykKbGlicmFyeSh2aXJpZGlzKQpoZWF0bWFwLjIodChhcy5tYXRyaXgoZGZfM18xXzI5X3d0W2RmXzNfMV8yOV93dCRyZXMuMS40ICVpbiUgYygzLDEsMjkpLDE6MTVdKSksY29sPXBsYXNtYSg1MDApLCBzY2FsZT0icm93IixDb2x2ID0gTkEsIFJvd3YgPSBOQSxDb2xTaWRlQ29sb3JzPWMoIiMwMDZkMmMiLCIjMmNhMjVmIiwiIzY2YzJhNCIsIiM5OWQ4YzkiKVthcy5udW1lcmljKGFzLmZhY3RvcihhZ2UpKV0sbGFiQ29sID1OQSxkZW5zaXR5LmluZm89Im5vbmUiLHRyYWNlPSJub25lIixkZW5kcm9ncmFtPSdub25lJyxzcnRDb2w9NDUsY2V4Q29sID0gMSxjb2xzZXA9YygxMDE4LDIzNDIpLGJyZWFrcz1zZXEoLTMsMyxsZW5ndGgub3V0PTUwMSkpCnBhcihsZW5kID0gMSkgICAgICAgICAgICMgc3F1YXJlIGxpbmUgZW5kcyBmb3IgdGhlIGNvbG9yIGxlZ2VuZApsZWdlbmQoImxlZnQiLCAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxlZ2VuZCBvbiB0aGUgaGVhdG1hcCBwbG90CiAgICBsZWdlbmQgPSBjKCJFMTUiLCAiRTE2IiwgIlAxIiwiUDQiKSwgIyBjYXRlZ29yeSBsYWJlbHMKICAgIGNvbCA9IGMoIiMwMDZkMmMiLCIjMmNhMjVmIiwiIzY2YzJhNCIsIiM5OWQ4YzkiKSwgICMgY29sb3Iga2V5CiAgICBsdHk9IDEsICAgICAgICAgICAgICMgbGluZSBzdHlsZQogICAgbHdkID0gMTAgICAgICAgICAgICAjIGxpbmUgd2lkdGgKKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdwbG90cykKaGVhdG1hcC4yKHQoYXMubWF0cml4KGRmXzNfMV8yOV93dFtkZl8zXzFfMjlfd3QkcmVzLjEuNCAlaW4lIGMoMywxLDI5KSwxOjE1XSkpLGNvbD1jaXZpZGlzKDUwMCksIHNjYWxlPSJyb3ciLENvbHYgPSBOQSwgUm93diA9IE5BLENvbFNpZGVDb2xvcnM9YygiIzAwNmQyYyIsIiMyY2EyNWYiLCIjNjZjMmE0IiwiIzk5ZDhjOSIpW2FzLm51bWVyaWMoYXMuZmFjdG9yKGFnZSkpXSxsYWJDb2wgPU5BLGRlbnNpdHkuaW5mbz0ibm9uZSIsdHJhY2U9Im5vbmUiLGRlbmRyb2dyYW09J25vbmUnLHNydENvbD00NSxjZXhDb2wgPSAxLGNvbHNlcD1jKDEwMTgsMjM0MiksYnJlYWtzPXNlcSgtMywzLGxlbmd0aC5vdXQ9NTAxKSkKcGFyKGxlbmQgPSAxKSAgICAgICAgICAgIyBzcXVhcmUgbGluZSBlbmRzIGZvciB0aGUgY29sb3IgbGVnZW5kCmxlZ2VuZCgibGVmdCIsICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGVnZW5kIG9uIHRoZSBoZWF0bWFwIHBsb3QKICAgIGxlZ2VuZCA9IGMoIkUxNSIsICJFMTYiLCAiUDEiLCJQNCIpLCAjIGNhdGVnb3J5IGxhYmVscwogICAgY29sID0gYygiIzAwNmQyYyIsIiMyY2EyNWYiLCIjNjZjMmE0IiwiIzk5ZDhjOSIpLCAgIyBjb2xvciBrZXkKICAgIGx0eT0gMSwgICAgICAgICAgICAgIyBsaW5lIHN0eWxlCiAgICBsd2QgPSAxMCAgICAgICAgICAgICMgbGluZSB3aWR0aAopCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTd9CgpwZGYoZmlsZSA9IHBhc3RlKCJNYW51c2NyaXB0L2hlYXRtYXAvIiwiYmFzYWxfZGV2IiwiLnBkZiIsIHNlcCA9ICIiKSwgd2lkdGggPSA3LCBoZWlnaHQgPSAzKQpoZWF0bWFwLjIodChhcy5tYXRyaXgoZGZfM18xXzI5X3d0W2RmXzNfMV8yOV93dCRyZXMuMS40ICVpbiUgYygzLDEsMjkpLDE6MTVdKSksY29sPWNpdmlkaXMoNTAwKSwgc2NhbGU9InJvdyIsQ29sdiA9IE5BLCBSb3d2ID0gTkEsQ29sU2lkZUNvbG9ycz1jKCIjMDA2ZDJjIiwiIzJjYTI1ZiIsIiM2NmMyYTQiLCIjOTlkOGM5IilbYXMubnVtZXJpYyhhcy5mYWN0b3IoYWdlKSldLGxhYkNvbCA9TkEsZGVuc2l0eS5pbmZvPSJub25lIix0cmFjZT0ibm9uZSIsZGVuZHJvZ3JhbT0nbm9uZScsc3J0Q29sPTQ1LGNleENvbCA9IDEsY29sc2VwPWMoMTAxOCwyMzQyKSxicmVha3M9c2VxKC0zLDMsbGVuZ3RoLm91dD01MDEpKQpwYXIobGVuZCA9IDEpICAgICAgICAgICAjIHNxdWFyZSBsaW5lIGVuZHMgZm9yIHRoZSBjb2xvciBsZWdlbmQKbGVnZW5kKCJsZWZ0IiwgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsZWdlbmQgb24gdGhlIGhlYXRtYXAgcGxvdAogICAgbGVnZW5kID0gYygiRTE1IiwgIkUxNiIsICJQMSIsIlA0IiksICMgY2F0ZWdvcnkgbGFiZWxzCiAgICBjb2wgPSBjKCIjMDA2ZDJjIiwiIzJjYTI1ZiIsIiM2NmMyYTQiLCIjOTlkOGM5IiksICAjIGNvbG9yIGtleQogICAgbHR5PSAxLCAgICAgICAgICAgICAjIGxpbmUgc3R5bGUKICAgIGx3ZCA9IDEwICAgICAgICAgICAgIyBsaW5lIHdpZHRoCikKZGV2Lm9mZigpCgpgYGAKCgpgYGB7cixmaWcud2lkdGg9MyxmaWcuaGVpZ2h0PTR9CmdncGxvdChkYXRhPXNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YVtzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMywxLDI5KSxdLGFlcyhyZXMuMS40LGZpbGw9YWdlKSkrIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwNmQyYyIsIiMyY2EyNWYiLCIjNjZjMmE0IiwiIzk5ZDhjOSIpKStzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cz1jKCIzIiwiMSIsIjI5IikpCmBgYAoKIyMjIyMgY2lsaWF0ZWQgY2VsbHMgYWNyb3NzIHRpbWU6CmBgYHtyfQpFMTVFMTZQMVA0X3d0X3JlczE0XzI3b3ZlcjIwPC1GaW5kTWFya2VycyhzZXVyYXRfRTE1RTE2UDFQNF93dCxpZGVudC4xPWMoMjcpLGlkZW50LjIgPSBjKDIwKSxvbmx5LnBvcyA9IFRSVUUpCkUxNUUxNlAxUDRfd3RfcmVzMTRfMjdvdmVyMjAKYGBgCmBgYHtyfQp3cml0ZS50YWJsZShFMTVFMTZQMVA0X3d0X3JlczE0XzI3b3ZlcjIwLCJFMTVFMTZQMVA0X3d0X3JlczE0XzI3b3ZlcjIwLnR4dCIsc2VwPSJcdCIpCgpgYGAKYGBge3J9CkUxNUUxNlAxUDRfd3RfcmVzMTRfMjBvdmVyMjc8LUZpbmRNYXJrZXJzKHNldXJhdF9FMTVFMTZQMVA0X3d0LGlkZW50LjE9YygyMCksaWRlbnQuMiA9IGMoMjcpLG9ubHkucG9zID0gVFJVRSkKRTE1RTE2UDFQNF93dF9yZXMxNF8yMG92ZXIyNwpgYGAKYGBge3J9CndyaXRlLnRhYmxlKEUxNUUxNlAxUDRfd3RfcmVzMTRfMjBvdmVyMjcsIkUxNUUxNlAxUDRfd3RfcmVzMTRfMjBvdmVyMjcudHh0IixzZXA9Ilx0IikKCmBgYAoKYGBge3IsZmlnLmhlaWdodD0yMCxmaWcud2lkdGg9NDB9CgpEb0hlYXRtYXAob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGdlbmVzLnVzZSA9IGMoIkVwY2FtIiwiQ294NmIyIiwiQ2tzMiIsIkgyYWZ4IiwiQ2NuYTEiLCJDY25vIiwiUGxrNCIsIkNkYzIwYiIsIkNkYzIwIiwiRm94bjQiLCJTaGlzYTgiLCJIeWxzMSIsIlNtaW0yNCIsIk1jaWRhcyIsIklmdDgwIiwiUHJyMTgiLCJTbnRuIiwiU3RtbmQxIiwiTGRscmFkMSIsIkNkaHI0IiwiQ2RocjMiLCJTbGMyM2EyIiwiQmFzcDEiLCJGYW0xNjZiIiwiSWZpdG0xIiwiTHk2YSIsIkx5NmUiLCJMeTZjMSIsIkFkYW04IiwiQ3hjbDE3IiwiQW9jMSIsIlJldG5sYSIsIkl0bG4xIiwiTHRmIiwiUHJyMTgiKSwgCiAgICBzbGltLmNvbC5sYWJlbCA9IFRSVUUsIGdyb3VwLmxhYmVsLnJvdCA9IFRSVUUsdXNlLnNjYWxlZCA9IFQsZ3JvdXAuYnk9InJlcy4xLjQiLGdyb3VwLmNleCA9IDUwLGNleC5yb3c9NDAsY2VsbHMudXNlID0gc2V1cmF0X0UxNUUxNlAxUDRfd3RAY2VsbC5uYW1lc1tzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMjAsMjcpXSxncm91cC5vcmRlciA9IGMoMjAsMjcpCiAgKQpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9MjAsZmlnLndpZHRoPTQwfQp0YWJsZShzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkcmVzLjEuNCkKYGBgCgpgYGB7cn0KZGZfMjBfMjdfd3Q8LUZldGNoRGF0YShzZXVyYXRfRTE1RTE2UDFQNF93dCxjKCJGb3hqMSIsIkxycmMyMyIsIkNjZGM2NyIsIkNlcDE1MiIsIlBsazQiLCJDY25hMSIsIkNjbm8iLCJDZGMyMGIiLCJDZGMyMCIsIkh5bHMxIiwiTWNpZGFzIiwiU21pbTI0IiwiSWZ0ODAiLCJQcnIxOCIsIlNudG4iLCJTdG1uZDEiLCJMZGxyYWQxIiwiQ2RocjQiLCJDZGhyMyIsIlNsYzIzYTIiLCJMeTZhIiwiTHk2YzEiLCJBZGFtOCIsIkN4Y2wxNyIsIklmaXRtMSIsImFnZSIsInJlcy4xLjQiKSkKZGZfMjBfMjdfd3Q8LWRmXzIwXzI3X3d0W29yZGVyKGRmXzIwXzI3X3d0JHJlcy4xLjQsZGZfMjBfMjdfd3QkYWdlKSxdCmBgYApgYGB7cn0KYWdlPC1zdWJzdHIocm93bmFtZXMoZGZfMjBfMjdfd3RbZGZfMjBfMjdfd3QkcmVzLjEuNCAlaW4lIGMoMjAsMjcpLF0pLDEsMykKCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGdwbG90cykKaGVhdG1hcC4yKHQoYXMubWF0cml4KGRmXzIwXzI3X3d0W2RmXzIwXzI3X3d0JHJlcy4xLjQgJWluJSBjKDIwLDI3KSwxOjI1XSkpLGNvbD1wbGFzbWEoNTAwKSwgc2NhbGU9InJvdyIsQ29sdiA9IE5BLCBSb3d2ID0gTkEsQ29sU2lkZUNvbG9ycz1jKCIjMDA2ZDJjIiwiIzJjYTI1ZiIsIiM2NmMyYTQiLCIjOTlkOGM5IilbYXMubnVtZXJpYyhhcy5mYWN0b3IoYWdlKSldLGxhYkNvbCA9TkEsZGVuc2l0eS5pbmZvPSJub25lIix0cmFjZT0ibm9uZSIsZGVuZHJvZ3JhbT0nbm9uZScsc3J0Q29sPTQ1LGNleENvbCA9IDEsY29sc2VwPWMoMzYyKSxicmVha3M9c2VxKC0zLDMsbGVuZ3RoLm91dD01MDEpKQpwYXIobGVuZCA9IDEpICAgICAgICAgICAjIHNxdWFyZSBsaW5lIGVuZHMgZm9yIHRoZSBjb2xvciBsZWdlbmQKbGVnZW5kKCJsZWZ0IiwgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsZWdlbmQgb24gdGhlIGhlYXRtYXAgcGxvdAogICAgbGVnZW5kID0gYygiRTE1IiwgIkUxNiIsICJQMSIsIlA0IiksICMgY2F0ZWdvcnkgbGFiZWxzCiAgICBjb2wgPSBjKCIjMDA2ZDJjIiwiIzJjYTI1ZiIsIiM2NmMyYTQiLCIjOTlkOGM5IiksICAjIGNvbG9yIGtleQogICAgbHR5PSAxLCAgICAgICAgICAgICAjIGxpbmUgc3R5bGUKICAgIGx3ZCA9IDEwICAgICAgICAgICAgIyBsaW5lIHdpZHRoCikKYGBgCmBgYHtyfQpsaWJyYXJ5KGdwbG90cykKaGVhdG1hcC4yKHQoYXMubWF0cml4KGRmXzIwXzI3X3d0W2RmXzIwXzI3X3d0JHJlcy4xLjQgJWluJSBjKDIwLDI3KSwxOjIyXSkpLGNvbD1jaXZpZGlzKDUwMCksIHNjYWxlPSJyb3ciLENvbHYgPSBOQSwgUm93diA9IE5BLENvbFNpZGVDb2xvcnM9YygiIzAwNmQyYyIsIiMyY2EyNWYiLCIjNjZjMmE0IiwiIzk5ZDhjOSIpW2FzLm51bWVyaWMoYXMuZmFjdG9yKGFnZSkpXSxsYWJDb2wgPU5BLGRlbnNpdHkuaW5mbz0ibm9uZSIsdHJhY2U9Im5vbmUiLGRlbmRyb2dyYW09J25vbmUnLHNydENvbD00NSxjZXhDb2wgPSAxLGNvbHNlcD1jKDM2MiksYnJlYWtzPXNlcSgtMywzLGxlbmd0aC5vdXQ9NTAxKSkKcGFyKGxlbmQgPSAxKSAgICAgICAgICAgIyBzcXVhcmUgbGluZSBlbmRzIGZvciB0aGUgY29sb3IgbGVnZW5kCmxlZ2VuZCgibGVmdCIsICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGVnZW5kIG9uIHRoZSBoZWF0bWFwIHBsb3QKICAgIGxlZ2VuZCA9IGMoIkUxNSIsICJFMTYiLCAiUDEiLCJQNCIpLCAjIGNhdGVnb3J5IGxhYmVscwogICAgY29sID0gYygiIzAwNmQyYyIsIiMyY2EyNWYiLCIjNjZjMmE0IiwiIzk5ZDhjOSIpLCAgIyBjb2xvciBrZXkKICAgIGx0eT0gMSwgICAgICAgICAgICAgIyBsaW5lIHN0eWxlCiAgICBsd2QgPSAxMCAgICAgICAgICAgICMgbGluZSB3aWR0aAopCmBgYAoKYGBge3IsZmlnLndpZHRoPTMsZmlnLmhlaWdodD00fQpnZ3Bsb3QoZGF0YT1zZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGFbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDIwLDI3KSxdLGFlcyhyZXMuMS40LGZpbGw9YWdlKSkrIAogICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkrIAogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPWMoIjIwIiwiMjciKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwNmQyYyIsIiMyY2EyNWYiLCIjNjZjMmE0IiwiIzk5ZDhjOSIpKQpgYGAKCmBgYHtyLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NX0KdGFibGUoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjRbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDIwLDI3KV0sc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJGFnZVtzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkcmVzLjEuNCAlaW4lIGMoMjAsMjcpXSkKYGBgCmBgYHtyLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NX0KdF9jaWxpYXRlZDwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKHNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRhZ2Vbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDIwLDI3KV0sc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjRbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDIwLDI3KV0pLDEpKQpgYGAKYGBge3IsZmlnLndpZHRoPTMsZmlnLmhlaWdodD0yfQpnZ3Bsb3QoZGF0YT10X2NpbGlhdGVkLGFlcyh4PVZhcjEseT1GcmVxLGdyb3VwPVZhcjIsY29sb3VyPVZhcjIpKStnZW9tX2xpbmUoKStnZW9tX3BvaW50KCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYApgYGB7cixmaWcud2lkdGg9MyxmaWcuaGVpZ2h0PTJ9CmdncGxvdChkYXRhPXRfY2lsaWF0ZWQsYWVzKHg9c3Vic3RyKFZhcjEsMSwxKSx5PUZyZXEsZ3JvdXA9VmFyMikpK2dlb21fbGluZShhZXMoY29sb3VyPVZhcjIpLGxpbmV0eXBlPSJkb3R0ZWQiKStnZW9tX3BvaW50KGFlcyhzaGFwZT1WYXIxKSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMC43KSkrCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoInNxdWFyZSBvcGVuIiwgImNyb3NzIiwiZGlhbW9uZCBvcGVuIiwicGx1cyIpKSAKYGBgCgojIyMjIyBzZWNyZXRvcnkgY2VsbHMgYWNyb3NzIHRpbWU6CmBgYHtyfQpFMTVFMTZQMVA0X3d0X3JlczE0XzJvdmVyNzwtRmluZE1hcmtlcnMoc2V1cmF0X0UxNUUxNlAxUDRfd3QsaWRlbnQuMT1jKDIpLGlkZW50LjIgPSBjKDcpLG9ubHkucG9zID0gVFJVRSkKRTE1RTE2UDFQNF93dF9yZXMxNF8yb3ZlcjcKYGBgCmBgYHtyfQpFMTVFMTZQMVA0X3d0X3JlczE0XzdvdmVyMjwtRmluZE1hcmtlcnMoc2V1cmF0X0UxNUUxNlAxUDRfd3QsaWRlbnQuMT1jKDcpLGlkZW50LjIgPSBjKDIpLG9ubHkucG9zID0gVFJVRSkKRTE1RTE2UDFQNF93dF9yZXMxNF83b3ZlcjIKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTgsZmlnLndpZHRoPTQwfQoKRG9IZWF0bWFwKG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBnZW5lcy51c2UgPSBjKCJTcGRlZiIsIkNyZWIzbDEiLCJDaXRlZDEiLCJEbmFqYjkiLCJLbGsxMCIsIktsazEzIiwiS2xrMTEiLCJNdWM1YWMiLCJNdWM1YiIsIk11YzEiLCJNdWM0IiwiR3AyIiwiVGZmMiIsIlNmdHBkIiwiU2NnYjFhMSIpLCAKICAgIHNsaW0uY29sLmxhYmVsID0gVFJVRSwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSx1c2Uuc2NhbGVkID0gVCxncm91cC5ieT0icmVzLjEuNCIsZ3JvdXAuY2V4ID0gNTAsY2V4LnJvdz00MCxjZWxscy51c2UgPSBzZXVyYXRfRTE1RTE2UDFQNF93dEBjZWxsLm5hbWVzW3NldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRyZXMuMS40ICVpbiUgYygyLDcpXQogICkKYGBgCmBgYHtyfQpkZl8yXzdfd3Q8LUZldGNoRGF0YShzZXVyYXRfRTE1RTE2UDFQNF93dCxjKCJTcGRlZiIsIkNyZWIzbDEiLCJDaXRlZDEiLCJEbmFqYjkiLCJLbGsxMCIsIktsazEzIiwiS2xrMTEiLCJNdWM1YiIsIk11YzEiLCJNdWM0IiwiR3AyIiwiVGZmMiIsIlNmdHBkIiwiU2NnYjFhMSIsImFnZSIsInJlcy4xLjQiKSkKZGZfMl83X3d0PC1kZl8yXzdfd3Rbb3JkZXIoZGZfMl83X3d0JHJlcy4xLjQsZGZfMl83X3d0JGFnZSksXQpgYGAKYGBge3J9CmFnZTwtc3Vic3RyKHJvd25hbWVzKGRmXzJfN193dFtkZl8yXzdfd3QkcmVzLjEuNCAlaW4lIGMoMiw3KSxdKSwxLDMpCgpgYGAKCmBgYHtyfQp0YWJsZShzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkcmVzLjEuNCkKCmBgYAoKYGBge3J9CmxpYnJhcnkoZ3Bsb3RzKQpoZWF0bWFwLjIodChhcy5tYXRyaXgoZGZfMl83X3d0W2RmXzJfN193dCRyZXMuMS40ICVpbiUgYygyLDcpLDE6MTRdKSksY29sPXBsYXNtYSg1MDApLCBzY2FsZT0icm93IixDb2x2ID0gTkEsIFJvd3YgPSBOQSxDb2xTaWRlQ29sb3JzPWMoIiMyY2EyNWYiLCIjNjZjMmE0IiwiIzk5ZDhjOSIpW2FzLm51bWVyaWMoYXMuZmFjdG9yKGFnZSkpXSxsYWJDb2wgPU5BLGRlbnNpdHkuaW5mbz0ibm9uZSIsdHJhY2U9Im5vbmUiLGRlbmRyb2dyYW09J25vbmUnLHNydENvbD00NSxjZXhDb2wgPSAxLGNvbHNlcD1jKDEwOTQpLGJyZWFrcz1zZXEoLTMsMyxsZW5ndGgub3V0PTUwMSkpCnBhcihsZW5kID0gMSkgICAgICAgICAgICMgc3F1YXJlIGxpbmUgZW5kcyBmb3IgdGhlIGNvbG9yIGxlZ2VuZApsZWdlbmQoImxlZnQiLCAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxlZ2VuZCBvbiB0aGUgaGVhdG1hcCBwbG90CiAgICBsZWdlbmQgPSBjKCAiRTE2IiwgIlAxIiwiUDQiKSwgIyBjYXRlZ29yeSBsYWJlbHMKICAgIGNvbCA9IGMoIiMyY2EyNWYiLCIjNjZjMmE0IiwiIzk5ZDhjOSIpLCAgIyBjb2xvciBrZXkKICAgIGx0eT0gMSwgICAgICAgICAgICAgIyBsaW5lIHN0eWxlCiAgICBsd2QgPSAxMCAgICAgICAgICAgICMgbGluZSB3aWR0aAopCmBgYApgYGB7cn0KbGlicmFyeShncGxvdHMpCmhlYXRtYXAuMih0KGFzLm1hdHJpeChkZl8yXzdfd3RbZGZfMl83X3d0JHJlcy4xLjQgJWluJSBjKDIsNyksMToxNF0pKSxjb2w9Y2l2aWRpcyg1MDApLCBzY2FsZT0icm93IixDb2x2ID0gTkEsIFJvd3YgPSBOQSxDb2xTaWRlQ29sb3JzPWMoIiMyY2EyNWYiLCIjNjZjMmE0IiwiIzk5ZDhjOSIpW2FzLm51bWVyaWMoYXMuZmFjdG9yKGFnZSkpXSxsYWJDb2wgPU5BLGRlbnNpdHkuaW5mbz0ibm9uZSIsdHJhY2U9Im5vbmUiLGRlbmRyb2dyYW09J25vbmUnLHNydENvbD00NSxjZXhDb2wgPSAxLGNvbHNlcD1jKDEwOTQpLGJyZWFrcz1zZXEoLTMsMyxsZW5ndGgub3V0PTUwMSkpCnBhcihsZW5kID0gMSkgICAgICAgICAgICMgc3F1YXJlIGxpbmUgZW5kcyBmb3IgdGhlIGNvbG9yIGxlZ2VuZApsZWdlbmQoImxlZnQiLCAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxlZ2VuZCBvbiB0aGUgaGVhdG1hcCBwbG90CiAgICBsZWdlbmQgPSBjKCAiRTE2IiwgIlAxIiwiUDQiKSwgIyBjYXRlZ29yeSBsYWJlbHMKICAgIGNvbCA9IGMoIiMyY2EyNWYiLCIjNjZjMmE0IiwiIzk5ZDhjOSIpLCAgIyBjb2xvciBrZXkKICAgIGx0eT0gMSwgICAgICAgICAgICAgIyBsaW5lIHN0eWxlCiAgICBsd2QgPSAxMCAgICAgICAgICAgICMgbGluZSB3aWR0aAopCmBgYAoKYGBge3IsZmlnLndpZHRoPTMsZmlnLmhlaWdodD00fQpnZ3Bsb3QoZGF0YT1zZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGFbc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjQgJWluJSBjKDIsNyksXSxhZXMocmVzLjEuNCxmaWxsPWFnZSkpKyAKICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpKyAKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cz1jKCIyIiwiNyIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMmNhMjVmIiwiIzY2YzJhNCIsIiM5OWQ4YzkiKSkKYGBgCgoKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD04fQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGlkID0gInJlcy4xLjQiKQoKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZmVhdHVyZXMucGxvdCA9IGMoIkZveGoxIiwiTWNpZGFzIiwiQ2RocjMiLCJDcmViM2wxIiwiU3BkZWYiLCJHcDIiKSwgbkNvbCA9IDMseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMSx1c2UucmF3PUYsZ3JvdXAuYnk9InNwZWNpZmljX3R5cGUiLGlkZW50LmluY2x1ZGUgPWMoMiw3LDIwLDI3LDI4KSApCgpgYGAKYGBge3IsZmlnLmhlaWdodD00LGZpZy53aWR0aD0zfQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBmZWF0dXJlcy5wbG90ID0gYygiZG91YmxldF9zY29yZSIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4xLHVzZS5yYXc9Rixncm91cC5ieT0ic3BlY2lmaWNfdHlwZSIsaWRlbnQuaW5jbHVkZSA9YygyLDcsMjAsMjcsMjgpICkKCmBgYAojIyMjIyBpbW11bmUgcmVzcG9uc2U6CiMjIyMjIFRvbGwgbGlrZSByZWNlcHRvcnMgYW5kIHNpZ25hbGluZzoKYGBge3IsZmlnLmhlaWdodD00MCxmaWcud2lkdGg9MjV9ClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGZlYXR1cmVzLnBsb3QgPSBjKCJUbHIxIiwiVGxyMiIsIlRscjMiLCJUbHI0IiwiVGxyNSIsIlRscjYiLCJUbHI3IiwiVGxyOCIsIlRscjkiLCJUbHIxMSIsIlRscjEyIiwiVGxyMTMiLCJNeWQ4OCIsIlRpY2FtMSIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0icmVzLjEuNCIpCgpgYGAKCiMjIyMjQ0xScyAoQy10eXBlIGxlY3RpbiBkb21haW4pOiAKYGBge3IsZmlnLmhlaWdodD0xMCxmaWcud2lkdGg9MjV9ClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGZlYXR1cmVzLnBsb3QgPSBjKCJSZWczYSIsIlJlZzNiIiwiUmVnM2ciLCJDbGVjNG4iKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCiMjIyMjIE5MUjoKYGBge3IsZmlnLmhlaWdodD02LGZpZy53aWR0aD0yNX0KVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZmVhdHVyZXMucGxvdCA9IGMoIk5vZDEiLCJOb2QyIiwiTmxycDYiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCiMjIyMjIFJMUjoKYGBge3IsZmlnLmhlaWdodD02LGZpZy53aWR0aD0yNX0KVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZmVhdHVyZXMucGxvdCA9IGMoIkRkeDU4IiwiSWZpaDEiLCJEaHg1OCIpLCBuQ29sID0gMSx4LmxhYi5yb3QgPSBULHBvaW50LnNpemUudXNlID0gMC4zLHVzZS5yYXc9Rixncm91cC5ieT0icmVzLjEuNCIpCgpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTIwLGZpZy53aWR0aD0yNX0KVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgZmVhdHVyZXMucGxvdCA9IGMoIkNkMTc3IiwiUHRnZHIiLCJGMnJsMSIsIlRzbHAiLCJJbDMzIiwiSWwyNSIsIkFnZXIiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCmBgYHtyLGZpZy5oZWlnaHQ9MTgsZmlnLndpZHRoPTI1fQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF9FMTVFMTZQMVA0X3d0LCBmZWF0dXJlcy5wbG90ID0gYygiRGVmYjEiLCJMeXoxIiwiTHl6MiIsIkx0ZiIsIkNhbXAiLCJTZnRwYTEiLCJTZnRwZCIsIlNscGkiKSwgbkNvbCA9IDEseC5sYWIucm90ID0gVCxwb2ludC5zaXplLnVzZSA9IDAuMyx1c2UucmF3PUYsZ3JvdXAuYnk9InJlcy4xLjQiKQoKYGBgCgoKCmBgYHtyfQpkZl9hbGxfd3Q8LUZldGNoRGF0YShzZXVyYXRfRTE1RTE2UDFQNF93dCxjKCJMYnAiLCJDZDE0IiwiVGxyNCIsIlRscjIiLCJNeWQ4OCIsIlRpY2FtMSIsIkl0bG4xIiwiUmVnM2ciLCJMZ2FsczMiLCJOb2QxIiwiTm9kMiIsIk5scnA2IiwiRGR4NTgiLCJJZmloMSIsIkRoeDU4IiwiU3VjbnIxIiwicmVzLjEuNCIsImFnZSIsInNlcV9ncm91cCIsInNwZWNpZmljX3R5cGUiLCJGb3hqMSIsIlNwZGVmIiwiRm94YTMiLCJDcmViM2wxIiwiR3AyIiwiVGZmMiIsIlNjZ2IxYTEiLCJDZnRyIiwiRm94aTEiLCJHamExIiwiTXVjMSIsIk11YzQiLCJNdWMxNiIsIk11YzIwIiwiTXVjNWIiLCJNdWM1YWMiLCJNdWMyIiwiRGVmYjEiLCJMeXoyIiwiTHRmIiwiU2Z0cGExIiwiU2Z0cGQiLCJTZnRwYiIsIlNscGkiLCJMY24yIiwiUGlnciIsIkNoaWw0IiwiQ2NsNSIsIkN4Y2wxMCIsIkN4Y2wyIiwiQ3hjbDEiLCJQZjQiLCJDeGNsMTIiLCJDeGNsMTQiLCJDeGNsMTUiLCJDeGNsMTYiLCJDeGNsMTciLCJDY2wyIiwiQ2NsNyIsIkNjbDE3IiwiQ2NsMjAiLCJDY2wyMWEiLCJDY2wyNSIsIkNjbDI3YSIsIkNjbDI4IiwiQ3gzY2wxIiwiSWwxMCIsIlRuZiIsIlMxMDBhOCIsIlMxMDBhOSIsIklsNiIsIklsMTgiLCJJbDFiIiwiSWwxcmwxIiwiQ2NsMTEiLCJDY2wyNCIsIklsMzMiLCJJbDI1IiwiVHNscCIsIkYycmwxIiwiUmV0bmxhIiwiQWxveDE1IiwiQWxveDUiLCJHYXRhMiIsIlRnZmIyIiwiVGdmYjEiLCJPcm1kbDMiLCJQdGdlcyIsIlB0Z2RzIiwiUHRnczIiLCJIcGdkcyIsIlRieGFzMSIsIkFyZWciLCJJbDIiLCJJbDE3YiIsIklsMTdkIiwiSWwzNCIsIklsMTEiLCJJbDE1IiwiSWZuayIsIklmbmxyMSIsIk5ma2JpeiIsIk5ma2JpYSIpKQoKYGBgCmBgYHtyfQp0YWJsZShjb2xuYW1lcyhkZl9hbGxfd3QpKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD03fQojZm9yIChpIGluIGMoIkxicCIsIkNkMTQiLCJUbHI0IiwiVGxyMiIsIk15ZDg4IiwiVGljYW0xIiwiSXRsbjEiLCJSZWczZyIsIkxnYWxzMyIsIk5vZDEiLCJOb2QyIiwiTmxycDYiLCJEZHg1OCIsIklmaWgxIiwiRGh4NTgiLCJTdWNucjEiKSkKI3sKI3BkZihmaWxlID0gcGFzdGUoIk1hbnVzY3JpcHQvTWljcm9iaWFsU2Vuc2luZy8iLGksIi5wZGYiLCBzZXAgPSAiIiksIHdpZHRoID0gNywgaGVpZ2h0ID0gMykKI3ByaW50KGdncGxvdChkZl9hbGxfd3RbKGRmX2FsbF93dCRzcGVjaWZpY190eXBlICVpbiUgI2MoIkJhc2FsIiwiU2VjcmV0b3J5IiwiQ2lsaWF0ZWQiLCJUcmFuc2l0aW9uYWwiLCJDaWxpYVNlY3JldG9yeSIsIkN5Y2xpbmdFcGl0aGVsaWFsIikpLF0sYWVzX3N0cmluZyh4PSJhZ2UiLHk9aSkpK2ZhY2V0X2dyaWQoLn5zcGVjaWZpY190eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9YWdlKSxiaW53aWR0aD0wLiMwMSxzdGFja2Rpcj0iY2VudGVyIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjgpLCBkb3RzaXplPTAuOCkrIHN0YXRfc3VtbWFyeShhZXMoY29sb3I9YWdlKSxmdW4uZGF0YT1tZWFuX3NkbCwgZnVuLmFyZ3MgPSBsaXN0KG11bHQ9MSksIAojICAgICAgICAgICAgICAgICBnZW9tPSJwb2ludHJhbmdlIixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjcpKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSxoanVzdD0xKSkpCiNkZXYub2ZmKCkKI30KYGBgCgojIyMjIyBTb21lIGNhdGVnb3JpZXMgb2YgZ2VuZXM6CiMjIyMjIGxpcGlkIHN5bnRoZXRpYyBlbnp5bWVzIG9yIGluaGliaXRvcnM6ICJPcm1kbDMiLCJQdGdlcyIsIlB0Z2RzIiwiUHRnczIiLCJIcGdkcyIsIkhwZ2RzIiwiUHRncjIiLCJUYnhhczEiLCJBbG94NSIsIlB0Z2RyIgojIyMjIyBrbm93biBUaDIgaW5kdWNlcnMsIGVmZmVjdG9ycywgYW5kIG1lZGlhdG9yczoiSWwxMCIsIlRuZiIsIlMxMDBhOCIsIlMxMDBhOSIsIklsNiIsIklsMTgiLCJJbDFiIiwiSWwxcmwxIiwiQ2NsMTEiLCJDY2wyNCIsIklsMzMiLCJJbDI1IiwiVHNscCIsIkYycmwxIiwiUmV0bmxhIiwiQWxveDE1IiwiQWxveDUiLCJHYXRhMiIsIlRnZmIyIiwiVGdmYjEiLCJPcm1kbDMiLCJQdGdlcyIsIlB0Z2RzIiwiUHRnczIiLCJIcGdkcyIsIlRieGFzMSIsIkFyZWciCiMjIyMjIGNoZW1va2luZXM6IFBicGIgbm90IGV4cHJlc3NlZCwgQ2NsMjFjLCBDY2wyMWMuMSwgQ3hjbDExIG5vdCBmb3VuZCBpbiBtbTEwLjEuMi4wLiAiQ3hjbDMiLCJDeGNsMiIsIkN4Y2wxIiwiUGY0IiwiQ3hjbDUiLCJDeGNsOSIsIkN4Y2wxMCIsIkN4Y2wxMiIsIkN4Y2wxMyIsIkN4Y2wxNCIsIkN4Y2wxNSIsIkN4Y2wxNiIsIkN4Y2wxNyIsIkNjbDEiLCJDY2wyIiwiQ2NsMyIsIkNjbDQiLCJDY2w1IiwiQ2NsNyIsIkNjbDgiLCJDY2wxMSIsIkNjbDEyIiwiQ2NsOSIsIkNjbDE3IiwiQ2NsMTkiLCJDY2wyMCIsIkNjbDIxYSIsIkNjbDIxYi4xIiwiQ2NsMjIiLCJDY2w2IiwiQ2NsMjQiLCJDY2wyNSIsIkNjbDI3YSIsIkNjbDI3YiIsIkNjbDI4IiwiWGNsMSIsIkN4M2NsMSIKIyMjIyMgZXhwcmVzc2VkIGNoZW1va2luZXM6ICJDY2w1IiwiQ3hjbDEwIiwiQ3hjbDIiLCJDeGNsMSIsIlBmNCIsIkN4Y2wxMiIsIkN4Y2wxNCIsIkN4Y2wxNSIsIkN4Y2wxNiIsIkN4Y2wxNyIsIkNjbDIiLCJDY2w3IiwiQ2NsMTciLCJDY2wyMCIsIkNjbDIxYSIsIkNjbDI1IiwiQ2NsMjdhIiwiQ2NsMjgiLCJDeDNjbDEiCiMjIyMjIEludGVybGV1a2lucyAoSWwzLElsOSxJbDIwLElsMzEgbm90IGV4cHJlc3NlZCk6IklsMTAiLCJJbDExIiwiSWwxMmEiLCJJbDEyYiIsIklsMTMiLCJJbDE1IiwiSWwxNiIsIklsMTdhIiwiSWwxN2IiLCJJbDE3YyIsIklsMTdkIiwiSWwxN2YiLCJJbDE4IiwiSWwxOSIsIklsMiIsIklsMjEiLCJJbDIyIiwiSWwyNCIsIklsMjUiLCJJbDI3IiwiSWwzMyIsIklsMzQiLCJJbDQiLCJJbDUiLCJJbDYiLCJJbDciLCJJbDFhIiwiSWwxYiIKIyMjIyMgQW50aW1pY3JvYmlhbCBlZmZlY3RvcnM6ICJNdWMxIiwiTXVjNCIsIk11YzE2IiwiTXVjMjAiLCJNdWM1YiIsIk11YzVhYyIsIk11YzIiLCJEZWZiMSIsIkx5ejIiLCJMdGYiLCJTZnRwYTEiLCJTZnRwZCIsIlNmdHBiIiwiU2xwaSIsIkxjbjIiLCJQaWdyIiwiQ2hpbDQiCiMjIyMjIGtub3duIGVwaXRoZWxpYWwgY3l0b2tpbmVzIGFuZCBtZWRpYXRvcnM6ICJJbDFhIiwiSWwyNSIsIklsMzMiLCJUc2xwIiwiQ3NmMiIsIkNjbDUiLCJDeGNsMTAiCiMjIyMjIE1vc3QgaW50ZXJmZXJvbnMgY2Fubm90IGJlIGZvdW5kIGluIG91ciBkYXRhc2V0OgoKYGBge3IsZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTV9ClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGZlYXR1cmVzLnBsb3QgPSBjKCJJZm5rIiwiSWZubHIxIiksZ3JvdXAuYnk9ImFnZSIsIGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikKYGBgCmBgYHtyfQpzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkdHlwZV9hZ2U8LWFzLmZhY3RvcihwYXN0ZShzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkY2VsbF90eXBlLHNldXJhdF9FMTVFMTZQMVA0X3d0QG1ldGEuZGF0YSRhZ2Usc2VwPSJfIikpCmBgYApgYGB7cn0Kc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHNwZWNpZmljVHlwZV9hZ2U8LWFzLmZhY3RvcihwYXN0ZShzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkc3BlY2lmaWNfdHlwZSxzZXVyYXRfRTE1RTE2UDFQNF93dEBtZXRhLmRhdGEkYWdlLHNlcD0iXyIpKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTYsZmlnLndpZHRoPTEyfQpzZXVyYXRfRTE1RTE2UDFQNF93dDwtU2V0QWxsSWRlbnQob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGlkID0gInNwZWNpZmljX3R5cGUiKQoKc2V1cmF0X0UxNUUxNlAxUDRfd3RAaWRlbnQgPSBmYWN0b3Ioc2V1cmF0X0UxNUUxNlAxUDRfd3RAaWRlbnQsbGV2ZWxzKHNldXJhdF9FMTVFMTZQMVA0X3d0QGlkZW50KVtjKDUsMSwxOSwxNyw0LDMsMTQsMTYsMjAsMTEsOSwxMCwxMywyMSwxMiwyLDgsNiwxOCwxNSw3KV0pCkRvdFBsb3Qob2JqZWN0ID0gc2V1cmF0X0UxNUUxNlAxUDRfd3QsIGNvbHMudXNlID0gYygiZm9yZXN0Z3JlZW4iLCJtYWdlbnRhMyIpLGdlbmVzLnBsb3QgPSBjKCJDY2wyMCIsIlB0Z2RzIiwiUHRnZXMiLCJQdGdzMiIsIkN4Y2wxNSIsIkN4Y2wxNyIsIkNjbDI4IiwiUmV0bmxhIiwiTmZrYmlhIiwiTmZrYml6IiwiRjJybDEiLCJBcmVnIiwiRGVmYjEiLCJTZnRwZCIsIlNmdHBiIiwiU2Z0cGExIiwiTXVjMSIsIk11YzQiLCJNdWMxNiIsIk11YzIwIiwiTXVjNWIiLCJNdWM1YWMiLCJNdWMyIiwiTHl6MiIsIkx0ZiIsIlNscGkiLCJMY24yIiwiUGlnciIsIkNoaWw0IiwiSXRsbjEiLCJMYnAiLCJMZ2FsczMiLCJSZWczZyIpLGdyb3VwLmJ5ID0gImlkZW50IiwgeC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQpCmBgYAoKYGBge3J9CnByaW50KGxldmVscyhzZXVyYXRfRTE1RTE2UDFQNF93dEBpZGVudCkpCmBgYAoKYGBge3IsZmlnLmhlaWdodD0xMCxmaWcud2lkdGg9MTB9CnNldXJhdF9FMTVFMTZQMVA0X3d0PC1TZXRBbGxJZGVudChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgaWQgPSAic3BlY2lmaWNUeXBlX2FnZSIpCnNldXJhdF9FMTVFMTZQMVA0X3d0QGlkZW50PWZhY3RvcihzZXVyYXRfRTE1RTE2UDFQNF93dEBpZGVudCxsZXZlbHMoc2V1cmF0X0UxNUUxNlAxUDRfd3RAaWRlbnQpW2MoMTY6MTksMTo0LDY2LDU5OjYxLDEyOjE1LDk6MTEsMzA6MzcpXSkKRG90UGxvdChvYmplY3QgPSBzZXVyYXRfRTE1RTE2UDFQNF93dCwgY29scy51c2UgPSBjKCJncmF5IiwiZm9yZXN0Z3JlZW4iKSxnZW5lcy5wbG90ID0gcmV2KGMoIkNjbDIwIiwiUHRnZHMiLCJQdGdlcyIsIlB0Z3MyIiwiQ3hjbDE1IiwiQ3hjbDE3IiwiQ2NsMjgiLCJSZXRubGEiLCJOZmtiaWEiLCJOZmtiaXoiLCJGMnJsMSIsIkFyZWciLCJEZWZiMSIsIlNmdHBkIiwiU2Z0cGIiLCJTZnRwYTEiLCJNdWMxIiwiTXVjNCIsIk11YzE2IiwiTXVjMjAiLCJNdWM1YiIsIk11YzVhYyIsIk11YzIiLCJMeXoyIiwiTHRmIiwiU2xwaSIsIkxjbjIiLCJQaWdyIiwiQ2hpbDQiLCJJdGxuMSIsIkxicCIsIkxnYWxzMyIsIlJlZzNnIikpLGdyb3VwLmJ5ID0gImlkZW50IiwgeC5sYWIucm90ID0gVCxwbG90LmxlZ2VuZCA9IFQsZG8ucmV0dXJuID0gVCkrcm90YXRlKCkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIHZqdXN0ID0gMSxoanVzdD0xKSkgI3RoaXMgc2NhbGVzIGJvdGggZ2Vub3R5cGVzIHRvZ2V0aGVyCmBgYAoKIyMjIyMgTXVjb3NhbCBjaGVtb2tpbmVzIChjY2wyNSwgY2NsMjgsIGN4Y2wxNCwgYW5kIGN4Y2wxNyk6CmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD04fQpsaWJyYXJ5KGdncHVicikKCmdncGxvdChkZl9hbGxfd3RbKGRmX2FsbF93dCRzcGVjaWZpY190eXBlICVpbiUgYygiQmFzYWwiLCJUcmFuc2l0aW9uYWwiLCJDaWxpYXRlZCIsIlNlY3JldG9yeSIsIkNpbGlhU2VjcmV0b3J5IiwiQ3ljbGluZ0VwaXRoZWxpYWwiKSksXSxhZXMoYWdlLEN4Y2wxNykpK2ZhY2V0X2dyaWQoLn5zcGVjaWZpY190eXBlKStnZW9tX2RvdHBsb3QoYmluYXhpcz0ieSIsYWVzKGZpbGw9YWdlKSxiaW53aWR0aD0wLjA1LHN0YWNrZGlyPSJjZW50ZXIiLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOCksIGRvdHNpemU9MC4yKSsgc3RhdF9zdW1tYXJ5KGFlcyhjb2xvcj1hZ2UpLGZ1bi5kYXRhPW1lYW5fc2RsLCBmdW4uYXJncyA9IGxpc3QobXVsdD0xKSwgCiAgICAgICAgICAgICAgICAgZ2VvbT0icG9pbnRyYW5nZSIscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC43KSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSkpCmBgYAoKCiMjIyMjIFRvIGxvb2sgaW50byBnZW5lcyBjb3JyZWxhdGVkIHdpdGggc2NHUFMgc2NvcmVzOgpgYGB7cn0KQ2lsaW9wYXRoeV9jb3JfdGVzdDwtYXBwbHkod3RfY2lsaW9wYXRoeV90YWJsZSwgMiwgZnVuY3Rpb24oeCkgY29yLnRlc3Qoc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJGNpbGlvcGF0aHlfc2NvcmUseCxtZXRob2Q9InBlYXJzb24iKSkgCmBgYApgYGB7cn0KZGZfQ2lsaW9wYXRoeV9jb3JfdGVzdDwtYXMuZGF0YS5mcmFtZShkby5jYWxsKHJiaW5kLCBDaWxpb3BhdGh5X2Nvcl90ZXN0KSkKCmBgYApgYGB7cn0KZGZfb3JkZXJfQ2lsaW9wYXRoeV9jb3JfdGVzdDwtZGZfQ2lsaW9wYXRoeV9jb3JfdGVzdFtvcmRlcih1bmxpc3QoZGZfQ2lsaW9wYXRoeV9jb3JfdGVzdCRlc3RpbWF0ZSksZGVjcmVhc2luZyA9IFRSVUUpLF0KYGBgCmBgYHtyfQp0aWR5X0NpbGlvcGF0aHlfY29yPC1jYmluZChkZl9vcmRlcl9DaWxpb3BhdGh5X2Nvcl90ZXN0JGVzdGltYXRlLGRmX29yZGVyX0NpbGlvcGF0aHlfY29yX3Rlc3QkcC52YWx1ZSkKYGBgCgpgYGB7cn0KY29sbmFtZXModGlkeV9DaWxpb3BhdGh5X2Nvcik8LWMoImNvciIsInAudmFsdWUiKQpgYGAKCmBgYHtyfQp0aWR5X0NpbGlvcGF0aHlfY29yCmBgYApgYGB7cn0KdW5saXN0KHRpZHlfQ2lsaW9wYXRoeV9jb3JbLDFdKQoKYGBgCgpgYGB7cn0KCiN2b2xjX0NpbGlvcGF0aHlfY29yPC1tdXRhdGUodGlkeV9DaWxpb3BhdGh5X2NvcixzaWc9aWZlbHNlKHRpZHlfQ2lsaW9wYXRoeV9jb3IkcC52YWx1ZTwwLjAxLCJQX2FkajwwLjAxIiwiTm90IFNpZyIpKQpkZl90aWR5X2NpbGlvcGF0aHlfY29yPC1kYXRhLmZyYW1lKG1hdHJpeCh1bmxpc3QodGlkeV9DaWxpb3BhdGh5X2NvciksIG5yb3c9MTEyLCBieXJvdz1GKSxzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKQpjb2xuYW1lcyhkZl90aWR5X2NpbGlvcGF0aHlfY29yKTwtYygiY29yIiwicC52YWx1ZSIpCmRmX3RpZHlfY2lsaW9wYXRoeV9jb3IkZ2VuZTwtcm93bmFtZXModGlkeV9DaWxpb3BhdGh5X2NvcikKYGBgCmBgYHtyfQpsaWJyYXJ5KGdncmVwZWwpCmdncGxvdChkZl90aWR5X2NpbGlvcGF0aHlfY29yLCBhZXMoY29yLCBwLnZhbHVlKSkrZ2VvbV9wb2ludCgpICtnZW9tX3RleHRfcmVwZWwoZGF0YT1maWx0ZXIoZGZfdGlkeV9jaWxpb3BhdGh5X2Nvcixjb3I+MC40NSksIGFlcyhsYWJlbD1nZW5lKSkreWxpbSgtMmUtMDUsMi41ZS0wNSkKcApwK2dlb21fdGV4dF9yZXBlbChkYXRhPWZpbHRlcihhcy5kYXRhLmZyYW1lKHRpZHlfQ2lsaW9wYXRoeV9jb3IpLCBwX3ZhbF9hZGo8MC4wNSksIGFlcyhsYWJlbD1yb3duYW1lcyh0aWR5X0NpbGlvcGF0aHlfY29yKSkpCmBgYApgYGB7cn0Kd3RfY2lsaW9wYXRoeV9jbHVzdGVyPC1kYXRhLmZyYW1lKHd0X2NpbGlvcGF0aHlfdGFibGUsc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjQpCmFnZ3JlX3d0X2NpbGlvcGF0aHlfY2x1c3RlcjwtYWdncmVnYXRlKHd0X2NpbGlvcGF0aHlfY2x1c3RlclssIDE6MTEyXSwgbGlzdCh3dF9jaWxpb3BhdGh5X2NsdXN0ZXJbLDExM10pLCBtZWRpYW4pCiNhZ2dyZV93dF9jaWxpb3BhdGh5X2NsdXN0ZXJbYWdncmVfd3RfY2lsaW9wYXRoeV9jbHVzdGVyJEdyb3VwLjE9PTgsXVtvcmRlcihhZ2dyZV93dF9jaWxpb3BhdGh5X2NsdXN0ZXJbYWdncmVfd3RfY2lsaW9wYXRoeV9jbHVzdGVyJEdyb3VwLjE9PTgsXSxkZWNyZWFzaW5nID0gVFJVRSldCmBgYApgYGB7cn0KeDwtc29ydChhZ2dyZV93dF9jaWxpb3BhdGh5X2NsdXN0ZXJbYWdncmVfd3RfY2lsaW9wYXRoeV9jbHVzdGVyJEdyb3VwLjE9PTgsXSxkZWNyZWFzaW5nID0gVFJVRSkKdW5saXN0KHgpWzI6MzBdCmBgYApgYGB7cn0Kd3RfbXVjb3NhX2NsdXN0ZXI8LWRhdGEuZnJhbWUocGVyY2VudGlsZV90YWJsZV9FMTVFMTZQMVA0d3RbLGNvbG5hbWVzKHBlcmNlbnRpbGVfdGFibGVfRTE1RTE2UDFQNHd0KSAlaW4lIGdlbmVMaXN0JE11Y29zYS5lcGl0aGVsaXVtLmdvYmxldF0sc2V1cmF0X0UxNUUxNlAxUDRfd3RAbWV0YS5kYXRhJHJlcy4xLjQpCmFnZ3JlX3d0X211Y29zYV9jbHVzdGVyPC1hZ2dyZWdhdGUod3RfbXVjb3NhX2NsdXN0ZXJbLCAxOjMwMV0sIGxpc3Qod3RfbXVjb3NhX2NsdXN0ZXJbLDMwMl0pLCBtZWRpYW4pCgpgYGAKYGBge3J9CnVubGlzdChzb3J0KGFnZ3JlX3d0X211Y29zYV9jbHVzdGVyW2FnZ3JlX3d0X211Y29zYV9jbHVzdGVyJEdyb3VwLjE9PTgsXSxkZWNyZWFzaW5nID0gVFJVRSkpWzI6NTFdCmBgYAoKCgoKCgoKCgoKCg==